AI 辅助:pandas 数据清洗高阶技巧:缺失值不是都要填
AI 辅助:pandas 数据清洗高阶技巧:缺失值不是都要填
一、缺失值也有业务含义
很多新手清洗数据时看到空值就填 0、填均值、填众数。这样做简单,但容易把业务含义洗没。用户年龄为空,可能是没填写;订单优惠为空,可能是没有优惠;发货时间为空,可能是还没发货;评分为空,可能是用户没有评价。不同缺失原因,对分析结论影响完全不同。
数据清洗不是把表变得整齐,而是把数据变得可信。缺失值处理前,先问一句:它为什么缺?能不能从其他字段推断?是否应该保留为空?是否会影响下游指标?
二、清洗链路:先诊断再处理
flowchart TD A[发现缺失] --> B[统计缺失比例] B --> C[按维度交叉分析] C --> D[判断缺失机制] D --> E[选择填充或保留] E --> F[记录处理规则]缺失比例要按维度看。整体缺失 5% 看似不高,但如果某个渠道缺失 80%,就说明采集链路可能有问题。清洗不只是 DataFrame 操作,也是在排查数据生产过程。
三、代码示例:按业务规则处理空值
下面是一段 pandas 示例,展示如何区分不同字段处理。
import pandas as pd def clean_orders(df: pd.DataFrame) -> pd.DataFrame: result = df.copy() result["discount_amount"] = result["discount_amount"].fillna(0) result["is_shipped"] = result["shipped_at"].notna() result["rating_missing"] = result["rating"].isna() result["rating"] = result["rating"].fillna(result["rating"].median()) result = result[result["pay_amount"].notna()] return result这段代码里,优惠为空可以填 0;发货时间为空转成状态;评分缺失保留一个标记再填中位数;支付金额为空直接剔除,因为核心指标无法计算。不同字段不同策略,才是认真清洗。
四、工程边界:清洗规则要可复现
数据清洗最怕写在一次性 Notebook 里,过两周没人知道当时为什么这么填。建议把清洗规则沉淀成函数、配置或数据质量任务,并记录字段含义、处理原因、影响范围。分析报告里也要说明关键清洗动作,尤其是剔除样本和填充缺失。
取舍方面,保留缺失标记会增加字段数量,但能帮助模型识别缺失本身的信号;简单填充方便建模,却可能引入偏差。对于业务报告,保守处理更重要,不确定就标注,不要悄悄填掉。对于机器学习,可以尝试多种策略并比较验证集表现。
还要注意链路问题。如果某个字段突然大面积缺失,不要只在分析层修补,应回到埋点、ETL、数据仓库排查。清洗可以处理历史脏数据,但不能替代数据质量治理。否则每天都在填坑,坑却一直变大。
生产环境里,清洗规则还要有版本。今天把优惠金额空值填 0,明天业务改成空值表示“未知优惠”,同一份代码就会生成错误结论。建议在规则里记录生效时间、适用表、负责人和变更原因。Notebook 可以探索,但稳定口径要进入代码仓库和调度系统。
另一个实用做法是保留原始字段和清洗后字段。比如 raw_rating、rating、rating_missing 同时存在,既方便建模,也方便回溯。不要为了表看起来干净,把原始信息彻底覆盖。数据清洗不是擦掉痕迹,而是让痕迹变得可理解。
生产落地补充:从能跑到可维护
从生产落地角度看,这类方案不能只停留在主流程。更关键的是把输入校验、失败分支、资源上限和回滚路径提前写清楚。主流程通常容易在演示环境里跑通,真正暴露问题的是异常输入、依赖抖动、并发放大和权限边界。一篇技术方案如果没有解释这些约束,读者很难判断它能否放进真实系统。
评估时建议先定义三类指标:正确性指标、稳定性指标和成本指标。正确性指标回答结果是否可信,稳定性指标回答失败时是否可控,成本指标回答持续运行是否划算。三类指标要同时进入验收清单,不能只用平均耗时或单次成功率证明方案有效。
五、总结
pandas 处理缺失值,关键不是熟悉多少 API,而是理解缺失背后的业务含义。先诊断、再处理、保留规则和影响说明,数据清洗才不会把问题洗成结论。
