Python数据分析实战:Pandas处理缺失值的5个高级技巧(附完整代码)

0 阅读2分钟

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一键删完了。

你平时怎么处理缺失值?有没有遇到过什么奇葩场景?评论区聊聊。