Pandas 如何检查 NaN 值
用 df.isna()(等价 isnull())返回布尔矩阵;配合 any()/sum() 回答"有没有""有多少""在哪列"。附统计、定位、筛选 NaN 行的完整用法。
一句话回答:用 df.isna()(与 df.isnull() 完全等价),返回同形状的布尔 DataFrame,True 的位置就是 NaN。实用组合:df.isna().any() 看哪些列有缺失、df.isna().sum() 数每列缺几个、df[df.isna().any(axis=1)] 筛出含缺失的行。
基本用法
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, np.nan, 3],
'B': [np.nan, 5, np.nan],
'C': [7, 8, 9]
})
df.isna()
# A B C
# 0 False True False
# 1 True False False
# 2 False True False
常用组合
df.isna().any() # 哪些列有 NaN
df.isna().sum() # 每列 NaN 个数
df.isna().sum().sum() # 全表 NaN 总数
df.isna().mean().round(3) # 每列缺失率(做数据质量报告时用)
df[df.isna().any(axis=1)] # 含有 NaN 的行
df[df['B'].isna()] # B 列为 NaN 的行
df.dropna() # 反向操作:删掉含 NaN 的行
单个值判断:pd.isna(x) 对标量返回 True/False,对数组/Series 返回布尔数组/Series;比 x != x 的 hack 可读性好得多。
这些也算"缺失"
isna() 覆盖的不只是 np.nan:
None(对象列里的空值)pd.NaT(datetime 列的缺失)pd.NA(可空整型 Int64、string 类型的缺失标记)
注意不包含:空字符串 ''、字符串 'nan'、无穷大 np.inf——这些不是缺失值,需要单独处理:
df = df.replace('', np.nan) # 空串当缺失
df = df.replace([np.inf, -np.inf], np.nan) # 无穷当缺失
常见问题(FAQ)
Q:isna() 和 isnull() 用哪个?
A:完全一样,isnull 只是别名。官方文档示例多用 isna,团队统一一个即可。
Q:为什么 df['A'] == np.nan 全是 False?
A:IEEE 754 规定 NaN 不等于任何值,包括它自己。所以判断缺失永远用 isna(),不用 ==。
Q:怎么只看某几列的缺失情况?
A:df[['A', 'B']].isna().sum();或找"A 缺失但 B 不缺失"的行:df[df['A'].isna() & df['B'].notna()](notna 是 isna 的反向)。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。