df.dropna(how='all', axis=1)可删除全为空值(nan/none)的列,但空字符串需先用replace转为nan;thresh参数更灵活,如thresh=5保留非空值≥5行的列。

dropna(how='all') 是最直接的解法,但必须配合 axis=1
很多人试了 dropna(how='all') 发现没效果,根本原因是默认只处理行(axis=0)。要删全为空的列,必须显式指定 axis=1:
-
df.dropna(how='all', axis=1)—— 正确:丢弃所有值都为NaN、None或空字符串(注意:空字符串不算空值!)的列 -
df.dropna(how='all')—— 错误:实际等价于df.dropna(how='all', axis=0),删的是全空的行
另外注意:how='all' 只认真正的缺失值(NaN、None),不把 ''、0、False 当空值。如果列里混着空字符串,得先清洗。
空字符串也算“空”?得先用 replace + np.nan 预处理
现实数据里常有 ''、' '、'N/A' 这类伪空值,dropna 完全无视它们。需要提前统一转成 NaN:
import numpy as np df = df.replace(['', ' ', 'N/A', 'NULL'], np.nan) df = df.dropna(how='all', axis=1)
注意顺序:必须先 replace 再 dropna;如果列含数字类型,replace 会自动跳过非字符串值,安全。
想保留至少一个非空值的列?用 thresh 参数更灵活
how='all' 是二元判断(全空才删),但有时你需要“至少保留 2 个有效值”的列,这时 thresh 更合适:
-
df.dropna(axis=1, thresh=1)→ 等价于how='all'(每列至少 1 个非空才保留) -
df.dropna(axis=1, thresh=5)→ 只保留非空值 ≥ 5 行的列
thresh 比 how 更可控,尤其在样本量不固定时,避免因某列刚好少一个值就被误删。
删完列后索引没变?别忘了 reset_index 可能不是必须的
dropna 不影响原 DataFrame 的索引,列删掉后列名自然消失,不需要 reset_index(那是重置行索引用的)。唯一要注意的是:
- 如果用了
inplace=True,返回值是None,别链式调用 - 删列后若要做
df.columns.tolist(),结果就是剩余列名,无需额外处理 - 如果列名含重复项,
dropna仍会按位置删列,不会报错但可能不符合预期——建议先检查df.columns.duplicated().any()
真正容易被忽略的是混合数据类型列里的隐式空值:比如一列是字符串和 NaN 混合,Pandas 会转成 object 类型,dropna 仍能识别 NaN;但如果存了字符串 'nan',它就永远删不掉——得靠 replace 先清理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











