最常用且稳妥的缺失值统计方法是df.isnull().sum(),它返回每列缺失值数量的series;需注意返回类型为np.int64,用于json等场景时需转为python原生int。

用 isnull().sum() 直接统计每列缺失值数量
这是最常用也最稳妥的做法。Pandas 的 isnull() 返回布尔 DataFrame,sum() 默认按行求和(即对 True 计数),所以直接链式调用就能拿到每列的缺失值个数。
- 别写
df.isnull().sum(axis=0)——axis=0是默认值,多写反而容易看漏 - 如果想看总缺失数,用
df.isnull().sum().sum(),外层sum()是对 Series 求和 -
isnull()和isna()完全等价,但团队里统一用一个就行,混用会增加代码审查负担
统计结果是 int64 类型,但注意它不是普通 Python int
返回的是 Pandas Series,每个值是 np.int64。这在做条件判断或传给某些函数时可能出问题:
- 比如
if df.isnull().sum()['col'] > 0:没问题;但json.dumps(...)会报错,得先转成 Python 原生类型:int(df.isnull().sum()['col']) - 导出到 Excel 或 CSV 通常自动兼容,但用在配置文件生成或 API 响应里要主动转换
- 用
.values.tolist()可一次性转为原生 Python 列表
想只看有缺失值的列?加个布尔索引就行
全量输出有时信息过载,尤其列数多的时候。用一行过滤就能聚焦问题列:
df.isnull().sum()[df.isnull().sum() > 0]
- 别用
df.isnull().sum().where(lambda x: x > 0)—— 会保留 NaN 占位,显示不干净 - 更简洁写法:
missing = df.isnull().sum(); missing[missing > 0],避免重复计算 - 如果后续还要排序,加
.sort_values(ascending=False),一眼看到缺失最多的列
isnull() 对不同数据类型的处理差异
它不是简单看值是否为 None,而是按 Pandas 内部缺失标识来判断:
-
NaN(float 列)、NaT(datetime 列)、None(object 列)都会被识别 - 空字符串
''、字符串'NULL'、数值0都不会被当成缺失 —— 这点常被误以为“没检测出来” - 如果业务上把
-999当作缺失码,得手动处理:df.replace(-999, np.nan).isnull().sum()










