df.dropna()默认按行删除(axis=0),删列需显式指定axis=1,并用thresh或how控制空值容忍度;它仅识别NaN/None/pd.NaT,不处理'N/A'等伪空值,inplace=True已不推荐。

df.dropna() 默认只删行,不是删列
很多人一上来就写 df.dropna(),发现空值多的列还在,数据没变——因为它的 axis 默认是 0(按行操作),也就是删掉**只要含空值的整行**。想删列,必须显式指定 axis=1。
常见错误现象:df.dropna() 后列数不变,但行数少了;或者用 df.dropna(axis=1) 却删掉了太多列,连只缺一个值的列都干掉了。
-
axis=0:删行(默认) -
axis=1:删列(必须写出来) - 不加
how参数时,默认how='any',即该轴上只要有一个NaN就触发删除
删列要控制“空值容忍度”:how 和 thresh
直接 df.dropna(axis=1) 太狠,容易把只缺 1–2 个值的有用列也清掉。得靠 how 或 thresh 控制阈值。
使用场景:比如某列 1000 行里只有 3 个 NaN,你不想丢,但另一列 80% 是空的,就得剔除。
-
how='any':该列只要有一个NaN,就删(最激进) -
how='all':该列全为NaN才删(几乎没用,慎选) -
thresh=n:保留至少有n个非空值的列(更灵活,推荐)
例如df.dropna(axis=1, thresh=len(df)*0.8)表示保留非空值占比 ≥ 80% 的列
空值判断受 dtype 和缺失标识影响
dropna() 只认 NaN、None、pd.NaT 这几种标准缺失值。如果数据里混着 'NULL'、'N/A'、空字符串 '',它完全看不见,不会删对应列。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
常见错误现象:明明看着某列全是 'N/A',但 df.dropna(axis=1) 毫无反应。
- 先统一清洗:用
df.replace({'N/A': pd.NA, 'NULL': pd.NA, '': pd.NA})转成标准缺失值 - 再配合
astype('string')或convert_dtypes()确保pd.NA被正确识别 - 检查前可跑
df.isna().sum()看真实空值分布,别信肉眼
inplace=True 不是万能解,链式操作会失效
有人习惯加 inplace=True 图省事,但在管道或连续调用中容易出问题——比如 df.dropna(axis=1).reset_index(),inplace=True 会让中间结果无法传递。
性能影响:对大表来说,inplace=True 并不真正节省内存,Pandas 内部仍可能复制数据;且未来版本已标记为弃用警告。
- 推荐写法:
df = df.dropna(axis=1, thresh=...) - 避免在方法链里用
inplace=True,它会让后续方法接收None - 真要原地改,确认变量没被其他地方引用,否则可能引发隐蔽 bug
最常被忽略的是空值定义本身——dropna 不处理字符串型“伪空值”,也不管你心里觉得“这列没用”而主观想删。它只响应明确的缺失标识和你设的阈值。跑之前,先 df.isna().sum() 看一眼,比猜靠谱得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










