择洗篇-Day10|补料添味:fillna 填充缺失值、dropna 删除缺失

0 次阅读 2026-10-21 14:39

📖 知识点

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 像 "缺菜的菜别上桌"—— 这道菜原料不全,干脆不做它。

⚠️ 易错提醒

  1. fillna / dropna 默认都返回新表,不改原表;要改原表加 inplace=True 或重新赋值
  2. dropna() 默认删 "任何列有缺失" 的行,别误删好数据
  3. 填充数值列前,先确认该列是数值类型,否则算均值会出错

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一个含缺失值的 DataFrame
  2. 用 df.fillna(0) 用 0 填充全部缺失
  3. 用 df["价格"].fillna(均值) 用均值填充价格列
  4. 用 df.dropna() 删除含缺失的行
  5. 对比各方法结果,理解填充与删除的区别

参考代码

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

🧠 思考题

  1. 填充和删除缺失值各适合什么场景?为什么 "价格" 列用均值填充比用 0 更合理?
  2. dropna() 默认删除的是 "含缺失的行" 还是 "含缺失的列"?想删列该加什么参数?