第 6 课 - Pandas 基础:DataFrame 与数据操作
学习目标
完成本课学习后,你将能够:
- 理解 Pandas 的核心数据结构:DataFrame 和 Series。
- 掌握创建 DataFrame 和从常见文件(如 CSV)中读取数据的方法。
- 熟练使用 Pandas 进行数据的选择、过滤和切片操作。
- 学会处理数据中的缺失值(NaN),进行基础的数据清洗。
- 掌握对 DataFrame 列进行简单计算和新增列的操作。
核心概念
1. 什么是 Pandas 和 DataFrame?
如果把 Python 的 list 比作一个购物清单,NumPy 的数组比作一个整齐的数字方阵,那么 Pandas 的 DataFrame 就像你电脑里的 Excel 表格。它是一个二维的、表格型的数据结构,每一列可以是不同的数据类型(如数字、字符串、布尔值),并且拥有清晰的行标签(索引)和列标签(列名)。
它是数据科学领域进行数据清洗、探索和预处理的核心工具。Pandas 建立在 NumPy 之上,因此可以无缝地进行高效计算。
2. DataFrame 的核心组件
- 数据(Data):表格中的实际数值。
- 索引(Index):每一行的标签,默认是 0, 1, 2...,但可以自定义。
- 列(Columns):每一列的名称,代表一个特征或变量。
一个 DataFrame 可以看作是由多个 Series(一维的、带标签的数组)按列组合而成的。
3. 核心操作流程
我们通常按这个顺序处理数据: 创建/读取 -> 查看与探索 -> 选择与过滤 -> 清洗 -> 计算 -> 输出
代码示例
以下是一个完整的、可运行的示例,演示了从创建数据到进行基本操作的全过程。
import pandas as pd
import numpy as np
# ============================
# 1. 创建 DataFrame
# ============================
# 方法一:通过字典创建。字典的键是列名,值是列数据列表。
data = {
‘姓名‘: [‘张三‘, ‘李四‘, ‘王五‘, ‘赵六‘],
‘年龄‘: [25, 30, 35, 28],
‘城市‘: [‘北京‘, ‘上海‘, ‘广州‘, ‘北京‘],
‘年薪‘: [150000, 200000, 180000, 120000]
}
df = pd.DataFrame(data)
print(“=== 原始 DataFrame ===“)
print(df)
print(f“\n数据类型:\n{df.dtypes}“) # 查看各列数据类型
# ============================
# 2. 从 CSV 文件读取(模拟)
# ============================
# 在实际中,你通常会从文件读取。
# 假设有一个 `employees.csv` 文件,内容与上面字典数据相同。
# df = pd.read_csv(‘employees.csv‘)
# ============================
# 3. 数据选择与过滤
# ============================
# 选择单列(返回一个 Series)
print(“\n=== 选择单列:姓名 ===“)
print(df[‘姓名‘])
# 选择多列(返回一个新的 DataFrame)
print(“\n=== 选择多列:姓名 和 城市 ===“)
print(df[[‘姓名‘, ‘城市‘]])
# 使用 loc(基于标签选择)和 iloc(基于位置选择)
print(“\n=== loc: 选择索引为1的行,‘姓名‘ 和 ‘城市‘ 列 ===“)
print(df.loc[1, [‘姓名‘, ‘城市‘]])
print(“\n=== iloc: 选择前两行,所有列 ===“)
print(df.iloc[:2, :])
# 条件过滤:找出年龄大于28岁的人
print(“\n=== 条件过滤:年龄 > 28 ===“)
print(df[df[‘年龄‘] > 28])
# 组合条件:北京且年薪 > 13万 (注意用 & 和括号)
print(“\n=== 组合条件:北京且年薪 > 130000 ===“)
print(df[(df[‘城市‘] == ‘北京‘) & (df[‘年薪‘] > 130000)])
# ============================
# 4. 数据清洗:处理缺失值
# ============================
# 制造一些缺失值
df.loc[2, ‘年龄‘] = np.nan # 将王五的年龄设为缺失
df.loc[3, ‘年薪‘] = np.nan # 将赵六的年薪设为缺失
print(“\n=== 包含缺失值的 DataFrame ===“)
print(df)
# 查看缺失值情况
print(f“\n各列缺失值数量:\n{df.isnull().sum()}“)
# 处理缺失值:方式一,删除含有缺失值的行
df_dropped = df.dropna()
print(“\n=== 删除缺失值后的 DataFrame ===“)
print(df_dropped)
# 处理缺失值:方式二,用特定值填充(例如用0或平均值)
df_filled = df.copy() # 创建副本,避免修改原数据
df_filled[‘年龄‘] = df_filled[‘年龄‘].fillna(df_filled[‘年龄‘].mean()) # 用平均年龄填充
df_filled[‘年薪‘] = df_filled[‘年薪‘].fillna(0) # 用0填充年薪
print(“\n=== 填充缺失值后的 DataFrame ===“)
print(df_filled)
# ============================
# 5. 数据计算与新增列
# ============================
# 对列进行向量化计算
df_filled[‘月薪‘] = df_filled[‘年薪‘] / 12 # 新增‘月薪‘列
print(“\n=== 新增‘月薪‘列后的 DataFrame ===“)
print(df_filled)
# 使用 apply 函数进行更复杂的计算(例如,对姓名列应用一个函数)
df_filled[‘姓名长度‘] = df_filled[‘姓名‘].apply(lambda x: len(x))
print(“\n=== 新增‘姓名长度‘列 ===“)
print(df_filled)
# 基础聚合统计
print(f“\n平均年龄: {df_filled[‘年龄‘].mean():.2f}“)
print(f“最高年薪: {df_filled[‘年薪‘].max()}“)
print(f“人数统计(按城市):\n{df_filled[‘城市‘].value_counts()}“)
实践练习
练习 1:基础创建与查看
创建一个包含以下信息的 DataFrame:
| 产品名 | 价格 | 库存量 | 类别 |
|---|---|---|---|
| Python书 | 59.9 | 100 | 书籍 |
| 机械键盘 | 299 | 50 | 外设 |
| 显示器 | 1599 | 30 | 电脑配件 |
| 鼠标 | 99 | 200 | 外设 |
- 打印该 DataFrame。
- 显示其数据类型。
- 打印出“类别”这一列。
练习 2:文件读取与选择
假设你有一个名为 sales.csv 的文件,其前三行数据如下:
订单号,产品,数量,单价,总价
1001,苹果,5,3.0,15.0
1002,香蕉,3,2.5,7.5
1003,苹果,2,3.0,6.0
- 用 Pandas 读取这个 CSV 文件。
- 选择并打印出“产品”和“总价”两列。
- 筛选出所有“产品”是“苹果”的记录。
练习 3:数据清洗与计算
继续使用练习 1 创建的 DataFrame。
- 人为将“显示器”的“价格”和“键盘”的“库存量”设置为缺失值(
np.nan)。 - 用该列的平均值分别填充“价格”和“库存量”的缺失值。
- 计算并新增一列“库存总价值”(价格 * 库存量)。
常见错误
-
索引混淆:使用
df[0]尝试选择第一行会报错(因为 Pandas 默认将括号[]用于选择列)。选择行应该用.loc[]或.iloc[]。# 错误! # first_row = df[0] # 正确! first_row = df.iloc[0] -
数据类型不匹配:在进行比较或计算时,确保列的数据类型正确。例如,从 CSV 读入的数字列可能是字符串
object类型,需要用pd.to_numeric()转换。# 假设 df[‘价格‘] 是字符串类型 ‘59.9‘ # df[‘价格‘] > 100 # 这会出错! # 应该先转换类型 df[‘价格‘] = pd.to_numeric(df[‘价格‘]) -
链式赋值警告(Chained Assignment):不要直接在切片或条件选择的结果上赋值,这可能会产生
SettingWithCopyWarning,且不一定能修改原数据。推荐使用.loc[]明确索引进行赋值。# 不推荐的做法(可能产生警告,且行为不确定) df[df[‘年龄‘] > 28][‘备注‘] = ‘资深‘ # 推荐的做法 df.loc[df[‘年龄‘] > 28, ‘备注‘] = ‘资深‘
小结
在本课中,我们迈出了数据科学实践中至关重要的一步:
- Pandas 的
DataFrame是处理表格数据的核心,它由行索引、列名和数据构成。 - 我们可以通过字典或读取 CSV 等文件来创建 DataFrame。
- 数据选择是基础操作,包括选择列(
df[‘col‘])、按标签选择(loc)、按位置选择(iloc)以及布尔条件过滤。 - 处理缺失值是数据清洗的第一课,主要方法是删除(
dropna)或填充(fillna)。 - 在 DataFrame 上,我们可以轻松地进行列间计算、新增列和聚合统计。
掌握 Pandas 将使你能够高效地“摆弄”任何表格数据,为后续的机器学习建模打下坚实的数据基础。下一课,我们将学习如何将处理好的数据用图表展示出来,即 Matplotlib 可视化入门。