【Python】数据清洗实战:从缺失值识别到智能填充的完整指南
1. 数据清洗的重要性与缺失值识别刚拿到一份电商订单数据时我习惯先检查数据完整性。记得有次分析用户行为数据跑了半天模型才发现30%的关键字段是空的——这就是缺失值的典型陷阱。数据清洗是分析前的必经之路而缺失值处理更是重中之重。用Pandas识别缺失值就像用X光扫描数据骨骼。最直接的方法是.isnull().sum()它能统计每列的缺失数量。但更直观的是计算缺失比例import pandas as pd # 读取电商订单数据 orders pd.read_csv(ecommerce_orders.csv) missing_ratio (orders.isnull().sum() / len(orders)).round(2) print(f缺失比例\n{missing_ratio[missing_ratio 0]})我曾遇到过三种典型缺失模式随机缺失如用户忘记填写性别系统缺失如未登录用户的ID字段隐藏缺失用特殊值表示的缺失如-999可视化能更直观发现缺失规律。用missingno库的矩阵图可以看到缺失字段是否集中在某些特定记录import missingno as msno msno.matrix(orders)2. 基础缺失值处理策略2.1 直接删除的适用场景当某列缺失率超过80%时我通常会整列删除。但删除行要谨慎——曾因盲目删除导致样本量减少70%。Pandas的dropna()有几个实用参数# 删除缺失率80%的列 cols_to_drop missing_ratio[missing_ratio 0.8].index orders_clean orders.drop(columnscols_to_drop) # 只保留至少包含5个有效值的行 orders_subset orders.dropna(thresh5)注意删除前务必检查业务逻辑。比如物流单号缺失的订单可能代表未发货的特殊状态。2.2 固定值填充技巧对于分类变量我常用UNKNOWN填充数值变量则用0或业务特定值。Pandas的fillna()支持字典式填充fill_values { user_id: GUEST, payment_amount: 0, delivery_city: orders[delivery_city].mode()[0] } orders_filled orders.fillna(fill_values)在金融风控场景中我遇到过用-1填充信用评分的案例结果导致模型误判。后来改用业务认可的默认值才解决问题。2.3 统计量填充实战选择均值、中位数还是众数要看数据分布收入类右偏数据用中位数正态分布的年龄用均值商品类别用众数# 分组填充更精准 - 按商品类别的平均价格填充 avg_price_by_category orders.groupby(category)[price].transform(mean) orders[price] orders[price].fillna(avg_price_by_category)最近一个用户分群项目中用用户所属群体的中位数填充消费金额比全局填充准确率提升了22%。2.4 前后向填充的妙用时间序列数据特别适合插值。处理销售数据时我用interpolate()实现了效果不错的填充# 按时间排序后线性插值 sales sales.sort_values(date) sales[revenue] sales[revenue].interpolate()但要注意陷阱如果前3天数据全缺失methodffill会一直向前寻找有效值。我曾因此错误填充了跨月数据后来加了limit3参数限制最大填充步长。3. 机器学习填充方法3.1 KNN最近邻填充当特征间存在明显相关性时KNN效果出众。处理用户画像数据时用年龄、职业等已知特征预测缺失的收入from sklearn.impute import KNNImputer imputer KNNImputer(n_neighbors5) user_features [age, education, occupation, income] users[user_features] imputer.fit_transform(users[user_features])注意需要先对分类变量进行编码。实测KNN在特征20维时效果下降明显。3.2 随机森林预测更复杂的方案是用随机森林预测缺失值。在房价预测项目中我用已知特征构建预测模型from sklearn.ensemble import RandomForestRegressor # 分割有/无缺失值的数据 known houses[houses[price].notnull()] unknown houses[houses[price].isnull()] # 训练预测模型 model RandomForestRegressor() model.fit(known[[size, location, year]], known[price]) preds model.predict(unknown[[size, location, year]]) # 回填预测值 houses.loc[houses[price].isnull(), price] preds这种方法虽然计算量大但在某电商数据集上比均值填充的RMSE降低了35%。4. 业务场景下的综合方案4.1 电商订单处理流程典型电商数据往往包含用户信息10-15%缺失商品属性5-8%缺失行为日志1-3%缺失我通常采用分级处理关键字段订单ID、金额→ 禁止缺失用户画像 → KNN填充商品标签 → 按类目众数填充行为数据 → 时间序列插值4.2 金融风控特殊处理金融数据对缺失敏感我的经验是征信评分 → 用随机森林预测交易记录 → 标记为特殊值而非填充身份信息 → 多层验证后补全某银行案例显示将缺失本身作为特征如是否缺失工作单位使欺诈识别准确率提升8%。4.3 评估填充效果的方法每次填充后我都会检查分布变化sns.kdeplot对比填充前后相关性变化.corr()矩阵比较业务合理性人工抽查典型样本曾用sklearn.metrics的mean_absolute_error评估填充准确度——用已知值人为制造缺失比较预测值与真实值的差异。