Pandas pd.isna() 函数
pd.isna() 是 Pandas 中最常用的缺失值检测函数,它会检查每个元素是否为缺失值,并返回一个布尔值(True 或 False)结构。
在数据分析中,缺失值处理是非常重要的第一步。pd.isna() 能帮助你快速识别数据中的缺失位置,为后续的填充、删除或其他处理操作提供依据。
基本语法与参数
语法格式
pandas.isna(obj)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| obj | DataFrame、Series、scalar、list、tuple | 需要检查缺失值的对象,可以是任意支持的数据类型。 |
返回值说明
- 返回与输入结构相同的布尔值对象:
- 输入是 DataFrame,返回布尔值的 DataFrame
- 输入是 Series,返回布尔值的 Series
- 输入是单个值,返回布尔值标量
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 pd.isna() 的用法。
示例 1:检测 Series 中的缺失值
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 Series
s = pd.Series([1, 2, np.nan, 4, None, 6])
# 检测缺失值
result = pd.isna(s)
print("原始 Series:")
print(s)
print("\n检测结果:")
print(result)
import numpy as np
# 创建一个包含缺失值的 Series
s = pd.Series([1, 2, np.nan, 4, None, 6])
# 检测缺失值
result = pd.isna(s)
print("原始 Series:")
print(s)
print("\n检测结果:")
print(result)
运行结果:
原始 Series: 0 1.0 1 2.0 2 NaN 3 4.0 4 NaN 5 6.0 dtype: float64 检测结果: 0 False 1 False 2 True 3 False 4 True 5 False dtype: bool
代码解析:
np.nan和None都被识别为缺失值- 返回的布尔 Series 中,缺失值位置为
True,非缺失值位置为False
示例 2:检测 DataFrame 中的缺失值
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': ['a', None, 'c', 'd'],
'C': [pd.NaT, 6, 7, 8] # NaT 是时间类型的缺失值
})
# 检测缺失值
result = pd.isna(df)
print("原始 DataFrame:")
print(df)
print("\n检测结果:")
print(result)
import numpy as np
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': ['a', None, 'c', 'd'],
'C': [pd.NaT, 6, 7, 8] # NaT 是时间类型的缺失值
})
# 检测缺失值
result = pd.isna(df)
print("原始 DataFrame:")
print(df)
print("\n检测结果:")
print(result)
运行结果:
原始 DataFrame:
A B C
0 1.0 a None
1 2.0 None 6
2 NaN c 7
3 4.0 d 8
dtype: object
检测结果:
A B C
0 False False True
1 False True False
2 True False False
3 False False False
代码解析:
pd.NaT(Not a Time)是时间类型的缺失值,同样被正确识别- DataFrame 的每个位置都会返回对应的布尔值
示例 3:统计缺失值数量
在实际数据分析中,我们经常需要知道有多少缺失值。
实例
import pandas as pd
import numpy as np
# 创建数据
df = pd.DataFrame({
'A': [1, np.nan, 3, np.nan, 5],
'B': [np.nan, 2, np.nan, 4, np.nan],
'C': [1, 2, 3, 4, 5]
})
# 统计每列的缺失值数量
print("每列缺失值数量:")
print(pd.isna(df).sum())
print("\n总缺失值数量:", pd.isna(df).sum().sum())
# 计算缺失值比例
print("\n缺失值比例:")
print((pd.isna(df).sum() / len(df) * 100).round(2), "%")
import numpy as np
# 创建数据
df = pd.DataFrame({
'A': [1, np.nan, 3, np.nan, 5],
'B': [np.nan, 2, np.nan, 4, np.nan],
'C': [1, 2, 3, 4, 5]
})
# 统计每列的缺失值数量
print("每列缺失值数量:")
print(pd.isna(df).sum())
print("\n总缺失值数量:", pd.isna(df).sum().sum())
# 计算缺失值比例
print("\n缺失值比例:")
print((pd.isna(df).sum() / len(df) * 100).round(2), "%")
运行结果:
每列缺失值数量: A 2 B 3 C 0 dtype: int64 总缺失值数量: 5 缺失值比例: A 40.0 B 60.0 C 0.0 %
示例 4:与其他函数结合使用
实例
import pandas as pd
import numpy as np
# 创建数据
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana', 'Eve'],
'age': [25, None, 35, 28, None],
'score': [85, 90, 78, 92, 88]
})
# 使用 isna 筛选出包含缺失值的行
rows_with_na = df[pd.isna(df).any(axis=1)]
print("包含缺失值的行:")
print(rows_with_na)
# 使用 isna 填充缺失值
df_filled = df.fillna({
'name': 'Unknown',
'age': df['age'].mean(), # 用平均值填充年龄
'score': 0
})
print("\n填充后的 DataFrame:")
print(df_filled)
import numpy as np
# 创建数据
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana', 'Eve'],
'age': [25, None, 35, 28, None],
'score': [85, 90, 78, 92, 88]
})
# 使用 isna 筛选出包含缺失值的行
rows_with_na = df[pd.isna(df).any(axis=1)]
print("包含缺失值的行:")
print(rows_with_na)
# 使用 isna 填充缺失值
df_filled = df.fillna({
'name': 'Unknown',
'age': df['age'].mean(), # 用平均值填充年龄
'score': 0
})
print("\n填充后的 DataFrame:")
print(df_filled)
运行结果:
包含缺失值的行:
name age score
0 Alice 25.0 85
2 None 35.0 78
3 Diana 28.0 92
填充后的 DataFrame:
name age score
0 Alice 25.0 85
1 Bob 29.0 90
2 Unknown 35.0 78
3 Diana 28.0 92
4 Eve 0.0 88
注意事项
重要提示:
pd.isna()会将以下值识别为缺失值:
np.nan- 数值型的缺失值None- Python 原生的 None 对象pd.NaT- 时间类型(datetime)的缺失值
对于空字符串 "" 或 0,pd.isna() 会返回 False,因为它们不是缺失值。

Pandas 常用函数