dropna()默认只识别np.nan、None、NaT,不处理空字符串、'NULL'或空白符;删列需显式设axis=1,空值需先replace转为标准缺失值再dropna。

直接用 dropna(),但默认行为只删行、不删列,且对空字符串、None、np.nan 敏感程度不同——得看清楚数据里缺的是什么。
为什么 dropna() 有时删不掉“看起来空”的行?
因为 dropna() 默认只识别 np.nan、None 和 pd.NaT;它**不把空字符串 ''、字符串 'NULL' 或空白符 ' ' 当作缺失值**。
- 先检查真实缺失类型:
df.isna().sum()或df.applymap(type).iloc[0](旧版) /df.map(type).iloc[0](2.1+) - 若含空字符串,得先转成
np.nan:df.replace('', np.nan).dropna() - 若含
'NULL'字符串:df.replace('NULL', np.nan).dropna()
删列比删行多一个关键参数:axis=1
删行是默认行为(axis=0),删列必须显式指定 axis=1,否则无效。
- 删掉**任意一列有缺失**的行:
df.dropna() - 删掉**整列全为缺失**的列:
df.dropna(axis=1, how='all') - 删掉**只要有一个缺失就删列**(慎用):
df.dropna(axis=1, how='any') - 只对特定列生效:
df.dropna(subset=['col_a', 'col_b'])
how 和 thresh 的实际取舍
how='any'(默认)太激进,how='all' 又太保守;真正灵活的是 thresh:表示该行/列至少要有多少个**非空值**才保留。
立即学习“Python免费学习笔记(深入)”;
- 保留至少 3 个非空值的行:
df.dropna(thresh=3) - 保留至少 5 个非空值的列:
df.dropna(axis=1, thresh=5) -
thresh比how更可控,尤其在宽表或稀疏数据中,避免误删有效样本
别忘了 inplace=True 是可选的,但一旦设了就无法撤销;建议先试运行不加它,确认结果无误再加。还有,时间列含 NaT、类别列含 None 也会被 dropna() 捕获——这点常被忽略。


















