人工智能基础-Pandas学习

一、目录:

  1. Series(一维带标签数组)
  2. DataFrame(二维带标签表格)
  3. Pandas 核心数据操作
  4. 数据读写(与外部文件交互)
  5. 练习


Pandas 有两个核心数据结构,所有数据处理都围绕它们展开:Series(一维数据)DataFrame(二维数据,类似 Excel 表格)

二、Series(一维带标签数组)

Series 由「数据值(values)」和「索引(index)」组成,索引可以自定义,默认是 0,1,2,... 递增整数。

(1)创建 Series

# 方式1:从列表创建(默认索引)
s1 = pd.Series([10, 20, 30, 40, 50])
print("默认索引的 Series:")
print(s1)

# 方式2:自定义索引
s2 = pd.Series([10, 20, 30, 40, 50], index=["a", "b", "c", "d", "e"])
print("\n自定义索引的 Series:")
print(s2)

# 方式3:从字典创建(字典的键作为索引,值作为数据)
s3 = pd.Series({"北京": 100, "上海": 200, "广州": 300})
print("\n从字典创建的 Series:")
print(s3)


(2)Series 核心属性

# 查看数据值(返回 numpy 数组)
print("数据值:", s2.values)
# 查看索引
print("索引:", s2.index)
# 查看数据类型
print("数据类型:", s2.dtype)
# 查看形状(一维数据,返回 (n,))
print("形状:", s2.shape)


三、DataFrame(二维带标签表格)

DataFrame 是 Pandas 中最常用的数据结构,可理解为「多行多列的表格」,包含「行索引(index)」、「列索引(columns)」和「数据值(values)」。

(1)创建 DataFrame:pd.DataFrame

# 方式1:从字典列表创建(最常用)
data1 = [
{"姓名": "张三", "年龄": 25, "城市": "北京"},
{"姓名": "李四", "年龄": 30, "城市": "上海"},
{"姓名": "王五", "年龄": 28, "城市": "广州"}
]
df1 = pd.DataFrame(data1)
print("从字典列表创建的 DataFrame:")
print(df1)

# 方式2:从二维数组+自定义行列索引创建
data2 = np.array([[25, "北京"], [30, "上海"], [28, "广州"]])
df2 = pd.DataFrame(
data2,
index=["张三", "李四", "王五"], # 行索引
columns=["年龄", "城市"] # 列索引
)
print("\n自定义行列索引的 DataFrame:")
print(df2)

# 方式3:从字典创建(字典的键作为列索引,值作为列数据)
data3 = {
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"城市": ["北京", "上海", "广州"]
}
df3 = pd.DataFrame(data3)
print("\n从字典创建的 DataFrame:")
print(df3)

(2)DataFrame 核心属性

# 查看行索引
print("行索引:", df3.index)
# 查看列索引
print("列索引:", df3.columns)
# 查看数据值(返回 numpy 二维数组)
print("数据值:\n", df3.values)
# 查看数据形状(行数, 列数)
print("形状:", df3.shape)
# 查看数据类型(每一列的数据类型)
print("数据类型:\n", df3.dtypes)
# 查看前 n 行(默认前5行,便于快速预览大数据集)
print("前2行:\n", df3.head(2))
# 查看后 n 行(默认后5行)
print("后2行:\n", df3.tail(2))
# 查看数据基本统计信息(仅针对数值型列,如计数、均值、标准差等)
print("基本统计信息:\n", df3.describe())


四、Pandas 核心数据操作

(1)选择列

# 从字典创建(字典的键作为列索引,值作为列数据)
data3 = {
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"城市": ["北京", "上海", "广州"]
}
df3 = pd.DataFrame(data3)

# 方式1:直接通过列名(适用于列名无空格、特殊字符)
name_col = df3["姓名"]
print("单列数据(Series类型):\n", name_col)

# 方式2:选择多列(传入列名列表,返回 DataFrame 类型)
name_age_col = df3[["姓名", "年龄"]]
print("\n多列数据(DataFrame类型):\n", name_age_col)
# 方式1:直接通过列名(适用于列名无空格、特殊字符)
name_col = df3["姓名"]
print("单列数据(Series类型):\n", name_col)

# 方式2:选择多列(传入列名列表,返回 DataFrame 类型)
name_age_col = df3[["姓名", "年龄"]]
print("\n多列数据(DataFrame类型):\n", name_age_col)

(2)选择行

# 方式1:基于行索引标签(loc)
row_zhangsan = df3.loc[0] # 第0行(默认行索引是0,1,2)
print("基于标签选择单行:\n", row_zhangsan)

# 方式2:基于行号(iloc,类似Python列表切片)
row_2 = df3.iloc[2] # 第3行(索引从0开始)
print("\n基于行号选择单行:\n", row_2)

# 方式3:选择多行(切片)
rows_0_1 = df3.loc[0:1] # loc 切片包含结束索引
rows_0_1_iloc = df3.iloc[0:2] # iloc 切片不包含结束索引
print("\nloc 选择多行:\n", rows_0_1)
print("\niloc 选择多行:\n", rows_0_1_iloc)

(3)选择指定行和列(切片 + 筛选)

# loc:标签索引(行标签, 列标签)
zhangsan_age = df3.loc[0, "年龄"]
print("张三的年龄:", zhangsan_age)

# iloc:行号索引(行号, 列号)
lisi_city = df3.iloc[1, 2]
print("李四的城市:", lisi_city)

# 选择多行多列
subset = df3.loc[0:1, ["姓名", "城市"]]
print("\n多行多列子集:\n", subset)

2. 数据筛选(条件查询)

通过布尔条件筛选符合要求的数据,类似 Excel 中的「筛选」功能。

# 条件1:年龄大于26
df_age_gt26 = df3[df3["年龄"] > 26]
print("年龄大于26的数据:\n", df_age_gt26)

# 条件2:多条件组合(& 且,| 或,条件需用括号包裹)
df_condition = df3[(df3["年龄"] > 26) & (df3["城市"] == "上海")]
print("\n年龄大于26且城市为上海的数据:\n", df_condition)

3. 数据修改与新增

(1)修改现有数据

# 修改单个值
df3.loc[0, "年龄"] = 26
print("修改张三年龄后:\n", df3)

# 修改整列数据
df3["城市"] = ["北京", "深圳", "广州"]
print("\n修改城市列后:\n", df3)


(2)新增列

# 方式1:直接赋值(基于现有列计算)
df3["年龄+5"] = df3["年龄"] + 5
print("新增年龄+5列后:\n", df3)

# 方式2:赋值固定值
df3["性别"] = "男"
print("\n新增性别列(固定值)后:\n", df3)

4. 数据清洗(处理缺失值与重复值)

(1)处理缺失值(NaN)

# 先创建一个包含缺失值的 DataFrame
df_missing = pd.DataFrame({
"姓名": ["张三", "李四", None, "赵六"],
"年龄": [26, None, 28, 32],
"城市": ["北京", "深圳", "广州", None]
})
print("包含缺失值的 DataFrame:\n", df_missing)

# 1. 检测缺失值(isnull() 返回布尔值,sum() 统计每列缺失值数量)
missing_count = df_missing.isnull().sum()
print("\n每列缺失值数量:\n", missing_count)

# 2. 删除缺失值(dropna(),默认删除包含任何缺失值的行)非常重要
df_dropna = df_missing.dropna()
print("\n删除缺失值后:\n", df_dropna)

# 3. 填充缺失值(fillna(),常用均值、中位数、固定值填充)非常重要
df_fillna = df_missing.fillna({
"姓名": "未知",
"年龄": df_missing["年龄"].mean(), # 用年龄列的均值填充
"城市": "未知城市"
})
print("\n填充缺失值后:\n", df_fillna)

(2)处理重复值

# 先创建一个包含重复值的 DataFrame
df_dup = pd.DataFrame({
"姓名": ["张三", "李四", "张三", "王五", "李四"],
"年龄": [26, 30, 26, 28, 30],
"城市": ["北京", "深圳", "北京", "广州", "深圳"]
})
print("包含重复值的 DataFrame:\n", df_dup)

# 1. 检测重复值(duplicated(),返回布尔值,keep='first' 标记除第一次外的重复行)
dup_flag = df_dup.duplicated()
print("\n重复值标记:\n", dup_flag)

# 2. 删除重复值(drop_duplicates(),默认保留第一次出现的行)
df_dropdup = df_dup.drop_duplicates()
print("\n删除重复值后:\n", df_dropdup)

五、数据读写(与外部文件交互)

Pandas 支持读写多种格式文件,最常用的是 CSV 文件Excel 文件(读写 Excel 需要额外安装 openpyxl(处理.xlsx)和 xlrd(处理.xls))。

1. 安装 Excel 依赖(可选)

pip install openpyxl xlrd


2. 读写 CSV 文件

# (1)将 DataFrame 写入 CSV 文件
df3.to_csv("user_info.csv", index=False) # index=False 不写入行索引
print("CSV 文件写入成功")

# (2)从 CSV 文件读取数据
df_read_csv = pd.read_csv("user_info.csv")
print("\n从 CSV 读取的数据:\n", df_read_csv)


3. 读写 Excel 文件

# (1)将 DataFrame 写入 Excel 文件
df3.to_excel("user_info.xlsx", sheet_name="用户信息", index=False)
print("Excel 文件写入成功")

# (2)从 Excel 文件读取数据
df_read_excel = pd.read_excel("user_info.xlsx", sheet_name="用户信息")
print("\n从 Excel 读取的数据:\n", df_read_excel)

六、练习

import pandas as pd
import os
# 1. 创建学生成绩数据
student_scores = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "赵六", "钱七"],
"语文": [85, 92, 78, 90, 88],
"数学": [90, 86, 89, 75, 95],
"英语": [88, 90, 93, 80, 85]
})

# 2. 计算每位学生的总分
student_scores["总分"] = student_scores["语文"] + student_scores["数学"] + student_scores["英语"]

# 3. 计算每科的平均分
subject_avg = student_scores[["语文", "数学", "英语"]].mean()
print("每科平均分:\n", subject_avg)

# 4. 按总分降序排序(找出成绩最好的学生)
student_scores_sorted = student_scores.sort_values(by="总分", ascending=False)
print("\n按总分降序排序后:\n", student_scores_sorted)

# 5. 筛选总分大于260分的学生
excellent_students = student_scores[student_scores["总分"] > 260]
print("\n总分大于260分的优秀学生:\n", excellent_students)

# 判断文件是否存在,不存在则创建
if (not os.path.exists("student_scores_analysis.xlsx")):
with open("student_scores_analysis.xlsx", "w") as f:
pass
# 6. 将结果写入 Excel 文件
student_scores_sorted.to_excel("student_scores_analysis.xlsx", index=False)
print("\n成绩分析结果已写入 Excel 文件")