用fillna()配合字典或method参数最可控;按列指定策略(如age填中位数、category填“Unknown”)、时序用ffill/bfill、慎用dropna和inplace=True,优先分析缺失的业务含义。

直接说结论:用 fillna() 配合字典或 method 参数最可控;盲目调用 dropna() 或全局均值填充,大概率会污染后续分析逻辑。
按列指定不同填充策略(最常用)
现实数据里,age 列适合填中位数,category 列适合填“Unknown”,score 列可能得插值——不能一刀切。
- 用字典传给
fillna():df.fillna({'age': df['age'].median(), 'category': 'Unknown', 'score': df['score'].interpolate()}) - 注意顺序:字典键必须严格匹配列名,大小写/空格错一个就无效
- 如果某列全为
NaN,median()会返回nan,导致该列没被填充,需提前加if pd.notna(...)判断
用 ffill/bfill 做时序/有序填充
当缺失值出现在时间序列、ID递增或自然排序的列中,前向/后向填充比统计值更合理。
-
df.fillna(method='ffill', axis=0)沿行方向用上一行非空值覆盖(默认行为) - 若想按组填充(比如每个
user_id组内独立前向填充),先groupby('user_id').apply(lambda x: x.fillna(method='ffill')) - 慎用:
ffill遇到开头连续NaN无法处理,会保持原样;可组合limit参数控制最多填充几行
为什么别急着用 dropna(how='any')
表面看删掉含 NaN 的行最省事,但实际常引发样本偏差或维度坍塌。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 如果
df.dropna(how='any').shape[0]比原始df.shape[0]少超过 15%,大概率说明缺失有系统性(如某批次传感器故障),删掉等于丢掉问题线索 -
how='all'只删全空行,安全;但thresh参数更灵活——例如保留至少 3 列非空的行:df.dropna(thresh=3) - 删除操作不可逆,建议先
df.isna().sum()查看各列缺失比例,再决定是删、填还是标记
inplace=True 是个容易忽略的陷阱
很多人写 df.fillna(0, inplace=True) 后发现链式操作失效,或函数里修改了原 df 却没返回,下游代码出错。
-
inplace=True不返回新 DataFrame,而是直接改原对象——但多数 Pandas 方法(包括fillna)在inplace=True时返回None - 链式调用会中断:
df.fillna(0, inplace=True).sort_values('x')报AttributeError - 推荐写法:
df = df.fillna({...}),明确赋值;或者用assign()做不可变更新:df.assign(age=df['age'].fillna(df['age'].median()))
真正难的不是填什么,而是判断「这一列的缺失是否携带业务含义」——比如 end_date 为空,可能代表合同仍在执行,填 NaT 比填今天日期更准确。多花两分钟看下缺失分布和业务文档,比调十次 fillna 更有效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










