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 的反向)。

核查依据

本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。


延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台