Python数据分析实战:Pandas处理缺失值的5个高级技巧
真实业务数据从来不会干净。今天把我在项目中踩过的坑,一次性整理给你。
做数据分析的都知道,数据清洗占整个分析工作量的60-80%。而缺失值处理,又是数据清洗中最常见的问题。
很多人遇到缺失值第一反应就是 df.dropna(),一行代码删完。然后呢?数据从10万行变成3万行,分析结论偏差巨大。
今天分享5个在真实项目中验证过的高级技巧,每个都有代码示例。
技巧1:按业务逻辑分组填充
**场景:**用户收入数据有缺失,但你不能简单地用全局均值填充。一线城市和三线城市的收入差距很大,全局均值会把三线城市的数据拉高。
**方案:**按城市分组,用组内中位数填充。
import pandas as pd
import numpy as np
# 模拟数据
df = pd.DataFrame({
'city': ['北京', '上海', '北京', '成都', '上海', '成都', '北京', '成都'],
'income': [25000, 22000, None, 8000, None, 7500, 28000, None]
})
# 按城市分组,用组内中位数填充
df['income'] = df.groupby('city')['income'].transform(
lambda x: x.fillna(x.median())
)
print(df)
# city income
# 0 北京 25000.0
# 1 上海 22000.0
# 2 北京 26500.0 0].sort_values(
'缺失比例', ascending=False
)
print(missing_stats)
# 缺失数量 缺失比例 数据类型
# income 520 52.0 float64
# city 498 49.8 object
# age 503 50.3 float64
# login_days 495 49.5 float64
# order_count 502 50.2 float64
# 2. 快速判断:缺失是否随机
# 按某个字段分组看缺失率差异
print(df.groupby('city')['income'].apply(lambda x: x.isna().mean()))
# city
# 上海 0.50
# 北京 0.51
# 广州 0.50
# 深圳 0.49
# 如果某组缺失率显著偏高,说明缺失不是随机的
总结:缺失值处理决策流程
**第一步:**先看缺失率——低于5%可以直接删或简单填充,高于30%需要特殊处理
**第二步:**判断缺失模式——是随机缺失还是系统性缺失(系统性缺失要标记)
**第三步:**选择填充策略——业务分组 > 时间插值 > 回归预测 > 全局统计量
**第四步:**始终保留缺失标记列——"缺失"本身就是信息
**第五步:**验证填充效果——对比填充前后的分布,确保没有引入偏差
**船长的话:**数据不说谎,但会误导人。缺失值处理不当,你的分析结论就是建立在沙子上的城堡。这5个技巧覆盖了90%的真实业务场景,建议收藏备用。别再用dropna一键删完了。
你平时怎么处理缺失值?有没有遇到过什么奇葩场景?评论区聊聊。