📖 知识点
1. fillna ():填充缺失值
用指定值把空位补上:
# 用0填充所有缺失
df.fillna(0)
# 用指定值填充"价格"列
df["价格"].fillna(0)
填充值可灵活选择:0、均值、指定数字等。
用均值填充数值列缺失(更 "合理",不凭空给 0):
# 用价格列均值填充该列缺失
mean_price = df["价格"].mean()
df["价格"].fillna(mean_price)
2. dropna ():删除缺失行 / 列
把含缺失的行直接删掉:
df.dropna() # 删除含缺失的行
df.dropna(axis=0) # 同上,删行
df.dropna(axis=1) # 删除含缺失的列
df.dropna(subset=["价格"]) # 只按某列判断,删除该列缺失的行
默认删除 "任何一列有缺失" 的行;
subset指定只看哪列。
3. 填充 vs 删除 怎么选?
| 情况 | 建议 |
|---|---|
| 缺失值不多、数值列 | 常用填充(均值 / 0) |
| 缺失值很少、行数多 | 可删除缺失行 |
| 某列缺失太多 | 考虑删掉整列 |
💡 生活比喻 fillna 像 "缺啥补啥"—— 价格忘了记,就用平均价补上;dropna 像 "缺菜的菜别上桌"—— 这道菜原料不全,干脆不做它。
⚠️ 易错提醒
fillna/dropna默认都返回新表,不改原表;要改原表加inplace=True或重新赋值dropna()默认删 "任何列有缺失" 的行,别误删好数据- 填充数值列前,先确认该列是数值类型,否则算均值会出错
⚔️ Kata 实战任务
任务需求:
- 导入 pandas,创建一个含缺失值的 DataFrame
- 用
df.fillna(0)用 0 填充全部缺失 - 用
df["价格"].fillna(均值)用均值填充价格列 - 用
df.dropna()删除含缺失的行 - 对比各方法结果,理解填充与删除的区别
参考代码
import pandas as pd
data = {
"菜名": ["白菜", "番茄", "土豆", "黄瓜"],
"价格": [3, 5, None, 4],
"数量": [10, None, 30, 15],
}
df = pd.DataFrame(data)
print("===== 原表 =====")
print(df)
print("\n===== 1. 用0填充全部缺失 =====")
print(df.fillna(0))
print("\n===== 2. 用均值填充价格列 =====")
mean_price = df["价格"].mean()
print(f"价格均值:{mean_price}")
print(df["价格"].fillna(mean_price))
print("\n===== 3. 删除含缺失的行 =====")
print(df.dropna())
运行输出:
===== 原表 =====
菜名 价格 数量
0 白菜 3.0 10.0
1 番茄 5.0 NaN
2 土豆 NaN 30.0
3 黄瓜 4.0 15.0
===== 1. 用0填充全部缺失 =====
菜名 价格 数量
0 白菜 3.0 10.0
1 番茄 5.0 0.0
2 土豆 0.0 30.0
3 黄瓜 4.0 15.0
===== 2. 用均值填充价格列 =====
价格均值:4.0
0 3.0
1 5.0
2 4.0
3 4.0
===== 3. 删除含缺失的行 =====
菜名 价格 数量
0 白菜 3.0 10.0
3 黄瓜 4.0 15.0
💡 对比观察:
- fillna (0):缺失位置全变成 0
- 均值填充:价格缺失用均值 4 补上
- dropna:行 1、行 2 含缺失,被删掉,只剩行 0、行 3
🧠 思考题
- 填充和删除缺失值各适合什么场景?为什么 "价格" 列用均值填充比用 0 更合理?
dropna()默认删除的是 "含缺失的行" 还是 "含缺失的列"?想删列该加什么参数?