小白从零开始勇闯人工智能:机器学习初级篇(pandas库)

引言

在上一篇文章中,我们学习了Python科学计算的核心库Numpy,在本章中我们将学习机器学习中负责数据处理和分析的Pandas库。Pandas是一个用Python编写的数据分析库,可以轻松处理数百万行数据,是AI工程师最常用的工具。

一、Pandas基础数据类型

1、Series:一维数据的"智能列表"

Pandas Series是一个带有索引的一维数据结构。它可以通过 pd.Series() 创建,既支持默认的数字索引,也允许自定义标签索引。Series 具有 index、values、dtype、shape 等关键属性,并可通过 describe() 获取统计摘要,或使用 head()、tail() 查看数据片段。在操作上,它支持通过标签或位置访问元素,可方便地通过条件筛选数据,并允许直接修改或添加新值。

1)、基本创建

复制代码
mport pandas as pd
#1、基本创建
# 创建第一个Series
s1 = pd.Series([1, 2, 3, 4, 5])
print(s1)
print(f"类型:{type(s1)}")
print(f"形状:{s1.shape}")

2)、自定义索引

复制代码
#2、自定义索引
# 创建带自定义索引的Series(就像给数据贴标签)
s2 = pd.Series([1, 2, 3],
               index=['小王', '小红', '小李'])
print("\n带自定义索引的Series:")
print(s2)
# 创建字符串类型的Series
s3 = pd.Series(['xaiowang', 'xiaohong', 'xiaoli'])
print("\n字符串Series:")
print(s3)

3)、Series的属性

复制代码
#3、Series的属性
# 查看Series的各种属性
# 查看索引
print(f"s1的索引:{s1.index}")
print(f"s2的索引:{s2.index}")

# 查看值
print(f"s1的值:{s1.values}")
print(f"s2的值:{s2.values}")

# 查看数据类型
print(f"s1的数据类型:{s1.dtype}")
print(f"s3的数据类型:{s3.dtype}")

# 查看大小
print(f"s1的长度:{len(s1)}")
print(f"s1的形状:{s1.shape}")

# 查看统计信息
print(f"s1的描述统计:")
print(s1.describe())

# 查看前几个/后几个值
print(f"s1的前3个值:")
print(s1.head(3))
print(f"s1的后2个值:")
print(s1.tail(2))

2、DataFrame:二维数据的"智能表格"

Pandas DataFrame是一个二维的、带行列标签的表格型数据结构。它通常通过字典创建,其中键为列名,值为列数据,并可自定义行索引(index 参数)。DataFrame 具有 index(行索引)、columns(列名)、values(底层 NumPy 数组)、shape(形状)、dtypes(各列数据类型)等核心属性,并可通过 describe() 获取统计摘要、info() 查看基本信息、head()/tail() 浏览数据片段。在数据访问上,可以通过列名直接获取单列(df'列名' 或 df.列名),通过列表获取多列(df\['列1','列2']),通过切片获取连续行(df0:2),以及使用 loc(基于标签)和 iloc(基于位置)精确访问行列交叉点的数据。

1)基本创建

复制代码
#1、基本创建
import pandas as pd
# 创建第一个DataFrame(学生信息表)
df1 = pd.DataFrame({
    '姓名': ['小王', '小红', '小李'],
    '年龄': [18, 16, 20],
    '成绩': [85, 92, 88],
    '班级': ['一班', '二班', '一班']
})
print(df1)
print(f"\nDataFrame形状:{df1.shape}")
print(f"数据类型:{type(df1)}")

2)、自定义索引

复制代码
#2、自定义索引
# 创建带自定义行索引的DataFrame
df2 = pd.DataFrame({
    '年龄': [18, 23, 22],
    '姓名': ['小明', '小崔', '小刚'],
    '收入': [100, 200, 300]
}, index=['学生1', '学生2', '学生3'])
print("\n带自定义索引的DataFrame:")
print(df2)

3)、DataFrame的属性

复制代码
#3、DataFrame的属性
# 查看行索引
print(f"行索引:{df1.index}")
print(f"行索引类型:{type(df1.index)}")

# 查看列名
print(f"列名:{df1.columns}")
print(f"列名类型:{type(df1.columns)}")

# 查看值
print(f"所有值:\n{df1.values}")
print(f"值类型:{type(df1.values)}")  # 其实是numpy数组

# 查看形状
print(f"形状(行×列):{df1.shape}")

# 查看数据类型
print(f"各列数据类型:\n{df1.dtypes}")

# 查看统计信息
print(f"\n数值列统计信息:")
print(df1.describe())

# 查看基本信息
print(f"\nDataFrame基本信息:")
print(df1.info())

# 查看前几行/后几行
print(f"\n前2行:\n{df1.head(2)}")
print(f"\n后1行:\n{df1.tail(1)}")

4)、访问DataFrame的数据

复制代码
# 方法1:使用点符号(
print(f"姓名列:\n{df1.姓名}")
# 方法2:使用方括号
print(f"\n年龄列:\n{df1['年龄']}")
# 访问多列
print(f"\n姓名和成绩列:\n{df1[['姓名', '成绩']]}")
# 访问行(通过位置切片)
print(f"\n前2行:\n{df1[0:2]}")
# 访问单个单元格
print(f"\n第一个学生的姓名:{df1.loc[0, '姓名']}")
print(f"第二个学生的年龄:{df1.iloc[1, 1]}")

二、DataFrame常见操作

1、排序数据

DataFrame的sort_values() 方法用于对数据进行排序,通过 by 参数指定排序依据的列名,ascending 参数控制升降序(默认为 True 即升序)。它可以进行单列排序,也可通过设置 ascending=False 进行降序排列。需要注意的是,该操作默认返回排序后的新 DataFrame,而不改变原始数据。

复制代码
import pandas as pd
# 创建示例数据
data = {
    '姓名': ['小明', '小红', '小王', '小李'],
    '年龄': [20, 16, 18, 21],
    '性别': ['男', '女', '男', '女']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 按年龄升序排序
df_sorted_asc = df.sort_values(by=['年龄'])
print("\n按年龄升序排序:")
print(df_sorted_asc)
# 按年龄降序排序
df_sorted_desc = df.sort_values(by=['年龄'], ascending=False)
print("\n按年龄降序排序:")
print(df_sorted_desc)

2、值替换

通过使用DataFrame的replace()方法,可以轻松替换指定列中的特定值。

复制代码
df['性别'] = df['性别'].replace(['男', '女'], ['male', 'female'])
print("替换后的数据:")
print(df)

三、数据查询的两种方法:loc和iloc

Pandas提供了 loc 和 iloc 两种核心方法来查询 DataFrame 的数据,两者的根本区别在于索引方式:loc 基于标签(行索引名和列名)进行查询,而 iloc 则基于整数位置(从0开始的行列序号)。尽管索引依据不同,但两者均可获取单个值、整行或整列、多行或多列。总之当使用行/列的名称时选择 loc,使用数字序号时选择 iloc。

复制代码
import pandas as pd
import numpy as np
a = pd.DataFrame({
    '成绩': [85, 92, 78, 95],
    '姓名': ['小明', '小红', '小李', '小王']
}, index=['stu1', 'stu2', 'stu3', 'stu4'])
print(a)
# 使用loc(基于标签)
print("\n使用loc:")
print(f"stu2的成绩:{a.loc['stu2', '成绩']}")
print(f"stu2到stu3:\n{a.loc['stu2':'stu3']}")
# 使用iloc(基于位置)
print("\n使用iloc:")
print(f"第2个学生(索引1)的成绩:{a.iloc[1, 0]}")
print(f"第2到第3个学生(索引1:3):\n{a.iloc[1:3]}")

四、简单操作DataFrame

1、修改列名和行索引

要修改DataFrame的列名和行索引,可以直接对其 columns 和 index 属性进行赋值。这种方法会直接修改原始DataFrame的结构,使用时需确保新列名数量与列数一致、新行索引数量与行数一致。

复制代码
import pandas as pd
df = pd.DataFrame({
    '年龄': [10, 11, 12],
    '姓名': ['小王', '小红', '小李'],
    '收入': [100, 200, 300]
}, index=['person1', 'person2', 'person3'])
print("原始DataFrame:")
print(df)
# 修改列名
df.columns = ['age', 'name', 'income']
print(f"修改后列名:{df.columns}")
print("修改后的DataFrame:")
print(df)
# 修改行索引
df.index = ['学生1', '学生2', '学生3']
print(f"修改后行索引:{df.index}")
print("修改后的DataFrame:")
print(df)

2、增加行或列

在Pandas中,向DataFrame添加新列可以直接通过赋值实现,要求列表长度与行数一致。而添加新行则通常通过loc索引器完成,这会在指定行索引位置插入一行数据,若该索引已存在则覆盖原行。这两种方法均会直接修改原DataFrame,添加时需注意数据对齐。

复制代码
#增加列
df['支出'] = [20, 30, 40]
print(df)
#增加行
df.loc['学生4'] = [23,'小崔', 400, 50]
print(df)

3、访问DataFrame数据

在 Pandas DataFrame中,访问数据有多种方式:通过点符号或方括号加列名字符串可以访问单个列,此时返回一个 Series;通过包含多个列名的列表可以访问多个列,此时返回一个 DataFrame。通过切片可以访问连续的行,返回一个DataFrame;通过 loc 索引器并传入行索引标签的列表可以访问指定的多行;而通过同时指定行标签和列标签可以访问特定的单个值。

复制代码
# 访问列
print(df['姓名'])
print(f"类型:{type(df['姓名'])}")
# 访问多列
print(df[['姓名', '年龄']])
print(f"类型:{type(df[['姓名', '年龄']])}")
# 访问行
print("\n3. 访问前3行:")
print(df[0:3])
# 访问行
print("\n4. 访问person1和person3:")
print(df.loc[['person1', 'person3']])
# 访问单个值
print("\n5. 访问person1的姓名:")
print(df.loc['person1', '姓名'])

4、删除数据

在Pandas中,删除数据可以通过多种方式实现。使用del语句可以直接在原始DataFrame上删除指定的列,而使用drop()方法提供了更灵活的删除选项:通过指定axis=1可以删除列,指定axis=0可以删除行。inplace参数控制删除操作是否在原始数据上执行:当inplace=False(默认)时返回删除后的新DataFrame而不改变原数据;当inplace=True时直接在原DataFrame上修改且不返回新对象。

复制代码
# 删除列
del df_copy['支出']
print(df_copy)
# 删除行
df_copy = df.copy()
df_copy.drop(['person3', 'person4'], axis=0, inplace=True)
print(df_copy)

五、数据的导入导出

1、读取文件

Pandas提供了多种读取文件的函数:pd.read_csv() 用于读取 CSV 格式文件,可通过 encoding 参数指定编码(如 'utf8'),通过 header=None 指定文件无表头;pd.read_excel() 用于读取 Excel 文件;pd.read_table() 常用于读取以特定分隔符分隔的文本文件,需通过 sep 参数明确分隔符(例如 sep=',' 表示逗号分隔)。

复制代码
#读取csv文件
import pandas as pd
df_1 =pd.read_csv("data1.csv",encoding='utf8',header=None)

#读取excel文件
df_3 = pd.read_excel("data2.xlsx")

#读取txt文件
df_4 = pd.read_table("data.txt",sep=',',header=None)

2、导出文件

Pandas提供了将DataFrame导出为多种文件格式的方法。使用 df.to_csv("文件名.csv", index=True, header=True) 可以将数据导出为 CSV 格式,其中 index 参数控制是否写入行索引,header 参数控制是否写入列名。同样,使用 df.to_excel("文件名.xlsx", index=True, header=True) 可以将数据导出为 Excel 格式。

复制代码
import pandas as pd
df_1.to_csv("导出.csv",index=True, header=True)
df_1.to_excel("导出.xlsx",index=True, header=True)

六、缺失值处理

在使用Pandas处理数据时,缺失值的处理通常有三种方法:数据补齐、删除对应数据行和不处理。首先,可以通过pd.read_csv()函数读取CSV文件。随后,使用df.isnull()进行逻辑判断,生成一个布尔类型的DataFrame来标识缺失值的位置。对于数据补齐,可以使用df.fillna('1')方法,将缺失值统一填充为指定值。对于删除对应数据行,则可以使用df.dropna()方法,直接删除包含缺失值的整行数据,从而得到一个完整的子集。

复制代码
import pandas as pd
import numpy as np
data_with_nan = {
    '姓名': ['小王', '小李', '小红', '小崔', '小明'],
    '年龄': [18, 20, 22, 24, 26],
    '工资': [5000, np.nan, 6000, np.nan, 5500],
    '部门': ['技术部', '销售部', np.nan, '技术部', '市场部'],
    '入职年份': [2022, 2023, 2024, 2025, 2025]
}
df = pd.DataFrame(data_with_nan)
print("包含缺失值的原始数据:")
print(df)
print(f"\n数据形状:{df.shape}")
# 检查缺失值
print(df.isnull())
# 处理缺失值
# 用固定值填充
df_fill_fixed = df.fillna(0)
print("用0填充所有缺失值:")
print(df_fill_fixed)
# 删除缺失值
df_drop_any = df.dropna()
print(df_drop_any)

七、重复值处理

pandas 处理数据中的重复值,首先通过 df.duplicated() 可以检测整行的重复,也可指定单列或列组合来判断部分重复,并返回布尔序列标记重复项位置。随后可以利用该布尔序列进行条件筛选,提取出所有重复行。最后通过 df.drop_duplicates() 删除重复行,默认基于所有列进行去重,也可指定列的子集进行部分去重。

复制代码
import pandas as pd
data_with_duplicates = {
    '姓名': ['小红', '小王', '小李', '小红', '小王'],
    '年龄': [18, 20, 22, 22, 20],
    '城市': ['合肥', '杭州', '宁波', '合肥', '杭州'],
    '工资': [5000, 6000, 5000, 5500, 6000]
}
df = pd.DataFrame(data_with_duplicates)
print(df)
# 检查整行重复
duplicated_rows = df.duplicated()
print(duplicated_rows)
# 查看重复的行
print("\n重复的行:")
print(df[duplicated_rows])
# 删除所有完全重复的行
df_no_duplicates = df.drop_duplicates()
print(df_no_duplicates)

到这里我们就学完了机器学习所需要掌握的两个核心库了,在下一章中将会真正的步入机器学习中。

相关推荐
江畔柳前堤3 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术4 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客4 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术4 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO5 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术5 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架6 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab6 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI6 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab6 小时前
【无标题】
人工智能·开源