HOWTO · Python

在 Python 中检查 NaN 值

学习如何在 Python 标量、列表、NumPy 数组和 Pandas 数据中检查 NaN 值,以及如何计算 Pandas 认定为缺失的值的数量。

本页内容

NaN 表示“非数字”(Not a Number),是一种特殊的浮点值。检查单个浮点数或由数值型浮点数构成的列表时,使用 math.isnan();检查 NumPy 数组时,使用 numpy.isnan();检查 Pandas 数据时,使用 pandas.isna()。这些检查用于识别 NaN 或库定义的缺失值,不会检查数据库中的 SQL NULL。

使用 math.isnan() 检查数字和列表

Python 的 math.isnan() 对浮点数 NaN 返回 True,对普通有限浮点数返回 False。对于由数值型浮点数组成的列表,可以用列表推导式逐项检查。此函数接收实数;字符串和任意对象都不是数值输入。

运行此示例:

import math

value = 3.5
print(math.isnan(value))
False

检查列表时,对每个值执行相同的检查:

import math

values = [1.0, float("nan"), 4.5]
checks = [math.isnan(value) for value in values]
print(checks)
[False, True, False]

单个数值的结果为 False,因为 3.5 不是 NaN。列表结果中间的 True 表示该位置的值是 NaN。由于 Python 会将布尔值视为整数,可以用 sum(checks) 统计 True 的个数。

使用 numpy.isnan() 检查 NumPy 数组

numpy.isnan() 会逐个检查数组元素,并返回形状相同的布尔数组。在代码中,常用别名 np 指代 NumPy,因此 np.isnan() 与 numpy.isnan() 是同一个函数。可以使用 np.nan 将 NaN 值放入数组。

import numpy as np

data = np.array([1.0, np.nan, 4.0])
print(np.isnan(data))
[False  True False]

每个 True 表示对应元素是 NaN,每个 False 表示该值不是 NaN。对于多维数组,布尔结果会保留输入数组的形状;可以使用这个掩码选出匹配的元素。

使用 pandas.isna() 检查 Pandas 缺失值

Pandas 的 isna() 会返回布尔 Series 或 DataFrame,其索引和形状与输入相对应。模块级函数 pandas.isna() 以及相应对象的方法(例如 df.isna()),都能定位 Pandas 识别为缺失的值。isnull() 是 Pandas 中等效的写法。Pandas 的缺失值检测适用于内存中的数据;它不会查询数据库中的 SQL NULL。

import pandas as pd

df = pd.DataFrame({"A": [1.0, float("nan")], "B": [float("nan"), 2.0]})
missing = pd.isna(df)
print(missing.sum())
A    1
B    1
dtype: int64

按默认的列轴对布尔 DataFrame 求和,可以得到每列的缺失值数量。此处,A 和 B 两列各有一个被 Pandas 识别为缺失的值。

使用 value != value 检查 NaN

对于普通的标量 NaN 浮点数,value != value 的结果为 True,因为 NaN 不等于自身。这只是有限场景下的替代写法,并非适用于所有 Python 数据类型的通用检查:自定义对象可以定义自己的比较行为,而类数组值可能返回逐元素结果。当输入类型与数据相符时,优先使用 math.isnan()、numpy.isnan() 或 pandas.isna()。