处理缺失值和异常值是Python数据清洗核心,需依业务逻辑和分布选择策略;缺失值含NaN、空字符串、占位符等,须多方法联合识别;填充应按数值型、分类型、时间型分别处理。

处理缺失值和异常值是Python数据清洗中最核心的两步,直接影响后续分析和建模效果。关键不是“删光”或“填满”,而是根据业务逻辑和数据分布做有依据的选择。
识别缺失值:别只看NaN
缺失值不只有np.nan,还可能表现为空字符串、占位符(如"NULL"、"missing"、-999)、或统一编码的异常码(如“999999”)。用df.isna()只能捕获NaN和None;需结合df.astype(str).applymap(lambda x: x.strip() == '')查空格空串,再用df.eq()匹配自定义缺失标记。
- 先运行df.info()看每列非空计数,快速定位问题字段
- 对分类变量,用df['col'].value_counts(dropna=False)查看缺失是否集中于某类
- 时间字段缺失时,注意检查是否因格式错误转为NaT(如"2023/13/01")
缺失值填充:按类型选策略
数值型、分类型、时间型缺失不能一概而论。均值/中位数填充适合近似正态分布且缺失率低(
- 用SimpleImputer(strategy='median')批量处理数值列,避免手动计算
- 对有序分类变量(如“低/中/高”),可映射为数字再插补,最后转回标签
- 时间序列数据缺失,用df.interpolate(method='time')比线性插值更合理
异常值检测:少依赖单一阈值
3σ法则和IQR法容易误判——前者假设正态分布,后者对长尾数据敏感。实际中建议组合使用:箱线图+散点图初筛,局部离群因子(LOF)识别密度异常点,再结合业务规则校验。例如电商订单金额异常,既要看统计离群,也要核对是否为批发大单或测试数据。
立即学习“Python免费学习笔记(深入)”;
- 用sns.boxplot(x='amount', data=df)一眼识别分布形态,决定用IQR还是百分位法
- 对多维异常(如“高浏览量+零成交”),用IsolationForest比单变量方法更有效
- 标记异常值而非直接删除,新增一列is_outlier便于后续分析影响
异常值处理:保留上下文信息
直接删除可能丢失重要模式(如黑产行为集中在某时段)。更稳妥的做法是:缩尾(Winsorize)处理极端值,或分箱后将异常归入“高风险”区间;若确认是录入错误,可尝试反向推算(如用同地区同品类均值修正)。
- 用scipy.stats.mstats.winsorize()限制上下5%分位外的值
- 对时间异常(如出生年份为2100),用pd.to_datetime(..., errors='coerce')转为NaT再统一处理
- 记录处理日志:哪列、用何方法、处理了多少条,方便复盘和审计










