必须在读取阶段拦截缺失标识,通过na_values显式声明并禁用默认NaN识别,结合dtype预声明避免类型升格;慎用ffill,限制填充长度或改用分组统计填充;超大文件用Dask需注意fillna限制,分块处理时用SimpleImputer保证全局统计一致。

读取阶段就拦截缺失标识,别等进内存再处理
千万级数据里,NaN 很少是标准浮点 nan,更多是 "N/A"、""、"missing" 这类字符串。如果用 df.replace() 或 df.isna() 后期清洗,整列被推成 object 类型,内存暴涨且无法向量化操作。
- 必须在
pandas.read_csv()时用na_values=["", "N/A", "NULL", "missing"]显式声明 - 同时设
keep_default_na=False,否则"NaN"字符串也会被转成浮点nan,造成误判 - 搭配
dtype预声明类型,比如{"age": "Int64", "price": "float64"},避免整列升为object
慎用 fillna(method="ffill"),长段连续缺失会污染几十万行
对时间序列或 ID 序列做前向填充很常见,但千万行中一旦某设备断连 2 小时,ffill 无限制填充会让一个错误值扩散到后续数十万行。
- 加
limit=100限制最多连续填充 100 行,超出即停 - 优先用
method="pad"(同ffill),它只依赖已知“过去”值,不引入未来信息 - 数值列别盲目用
ffill,改用fillna(df["col"].median())或按业务分组后填充,比如df.groupby("device_id")["temp"].transform(lambda x: x.fillna(x.median()))
超大文件别硬扛,dask.dataframe 填充要绕开三个坑
单机内存撑不住千万行宽表时,dask 是更现实的选择,但它和 pandas 的 fillna 行为差异极大。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
dask.dataframe.DataFrame.fillna()不支持inplace=True,必须写成df = df.fillna(...) -
value参数不能传动态计算的Series(如df.mean()),得先.compute()出标量再传入 - 列类型推断弱,读取后立刻用
df = df.astype({"col": "float64"})显式转换,否则fillna(0)可能失败
分块加载时,用 SimpleImputer 保证跨 chunk 统计量一致
用 chunksize 分批读 CSV 时,各 chunk 单独调用 fillna(df["col"].mean()),会导致同一列在不同 chunk 用不同均值填充——破坏数据一致性。
立即学习“Python免费学习笔记(深入)”;
- 第一遍遍历所有 chunk,只调用
imputer.fit(chunk[cols])(仅拟合,不 transform) - 第二遍再对每个 chunk 调用
imputer.transform(chunk[cols]),确保全局统计量统一 - 特别适合需要标准化的场景,比如后续接
LinearRegression填充,必须先用StandardScaler对特征做量纲归一
真正难的不是填什么值,而是填的时候不偷看测试集、不分裂结构、不放大偏差——这些细节一旦漏掉,模型上线后指标掉得无声无息。

















