Pandas pd.notna() 函数
pd.notna() 是 Pandas 库中用于检测缺失值的函数。它会检查输入对象中的每个元素,判断是否为非缺失值,并返回一个布尔值(True/False)组成的结果。
这是数据清洗中最常用的函数之一,可以帮助我们快速识别数据中的有效值,为后续的数据处理和分析做好准备。
单词释义: not 是否定,na 是 "not available"(不可用)的缩写,合起来就是"不是缺失值"的意思。
基本语法与参数
pd.notna() 是 Pandas 库的顶级函数,可以直接通过 pd.notna() 调用,也可以通过 Series 或 DataFrame 对象的 .notna() 方法调用。
语法格式
pd.notna(obj)
参数说明
- 参数:
obj- 类型: 任意 Python 对象,如 Series、DataFrame、列表、数组、标量值等。
- 描述: 要检查是否为非缺失值的对象。Pandas 中缺失值包括
None、NaN、NaT(缺失的时间类型)以及pandas.NA。
函数说明
- 返回值: 返回与输入对象形状相同的布尔值对象。如果是 Series 或 DataFrame,返回同类型的对象;如果是标量,返回单一的布尔值。
- 效果: 对于非缺失值返回
True,对于缺失值返回False。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 pd.notna() 的用法。
示例 1:基础用法 - 检测标量和列表中的缺失值
实例
import pandas as pd
import numpy as np
# 1. 检测标量值是否为非缺失值
print("=== 标量检测 ===")
print(f"pd.notna(10): {pd.notna(10)}") # 正常数值 -> True
print(f"pd.notna('runoob'): {pd.notna('runoob')}") # 正常字符串 -> True
print(f"pd.notna(None): {pd.notna(None)}") # None -> False
print(f"pd.notna(np.nan): {pd.notna(np.nan)}") # np.nan -> False
# 2. 检测列表中的缺失值
print("\n=== 列表检测 ===")
data_list = [1, 2, np.nan, 'runoob', None, 5]
result = pd.notna(data_list)
print(f"原始列表: {data_list}")
print(f"检测结果: {result.tolist()}") # 转换为列表方便查看
import numpy as np
# 1. 检测标量值是否为非缺失值
print("=== 标量检测 ===")
print(f"pd.notna(10): {pd.notna(10)}") # 正常数值 -> True
print(f"pd.notna('runoob'): {pd.notna('runoob')}") # 正常字符串 -> True
print(f"pd.notna(None): {pd.notna(None)}") # None -> False
print(f"pd.notna(np.nan): {pd.notna(np.nan)}") # np.nan -> False
# 2. 检测列表中的缺失值
print("\n=== 列表检测 ===")
data_list = [1, 2, np.nan, 'runoob', None, 5]
result = pd.notna(data_list)
print(f"原始列表: {data_list}")
print(f"检测结果: {result.tolist()}") # 转换为列表方便查看
运行结果预期:
=== 标量检测 ===
pd.notna(10): True
pd.notna('runoob'): True
pd.notna(None): False
pd.notna(np.nan): False
=== 列表检测 ===
原始列表: [1, 2, nan, 'runoob', None, 5]
检测结果: [True, False, True, False, True]
代码解析:
pd.notna(10)和pd.notna('runoob')检测正常的数值和字符串,返回True。pd.notna(None)和pd.notna(np.nan)检测 Python 和 NumPy 的缺失值标记,返回False。- 对列表使用
pd.notna()会返回一个布尔列表,缺失值位置为False。
示例 2:检测 Series 中的缺失值
在处理 Series 数据时,pd.notna() 可以快速定位有效数据。
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 Series
s = pd.Series([1, 2, np.nan, 4, None, 'runoob', np.nan])
print("=== 原始 Series ===")
print(s)
print(f"\n类型: {type(s)}")
# 使用 pd.notna() 检测
print("\n=== pd.notna() 检测结果 ===")
result = pd.notna(s)
print(result)
# 使用 Series 的 notna() 方法(等价效果)
print("\n=== s.notna() 方法检测 ===")
print(s.notna())
# 筛选出非缺失值
print("\n=== 筛选非缺失值 ===")
print(s[s.notna()])
import numpy as np
# 创建一个包含缺失值的 Series
s = pd.Series([1, 2, np.nan, 4, None, 'runoob', np.nan])
print("=== 原始 Series ===")
print(s)
print(f"\n类型: {type(s)}")
# 使用 pd.notna() 检测
print("\n=== pd.notna() 检测结果 ===")
result = pd.notna(s)
print(result)
# 使用 Series 的 notna() 方法(等价效果)
print("\n=== s.notna() 方法检测 ===")
print(s.notna())
# 筛选出非缺失值
print("\n=== 筛选非缺失值 ===")
print(s[s.notna()])
运行结果预期:
=== 原始 Series === 0 1 1 2 2 NaN 3 4 4 None 5 runoob 6 NaN dtype: object === pd.notna() 检测结果 === 0 True 1 True 2 False 3 True 4 False 5 True 6 False dtype: bool === s.notna() 方法检测 === 0 True 1 True 2 False 3 True 4 False 5 True 6 False dtype: bool === 筛选非缺失值 === 0 1 1 2 3 4 5 runoob dtype: object
代码解析:
pd.notna(s)和s.notna()都能检测 Series 中的缺失值,返回布尔 Series。- 利用布尔索引
s[s.notna()]可以快速筛选出所有非缺失值的元素,这在数据清洗中非常实用。
示例 3:检测 DataFrame 中的缺失值
处理表格数据时,pd.notna() 可以快速了解数据的完整程度。
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana'],
'age': [25, np.nan, 30, 28],
'score': [85, 90, np.nan, 95]
})
print("=== 原始 DataFrame ===")
print(df)
# 检测整个 DataFrame
print("\n=== pd.notna() 检测结果 ===")
print(pd.notna(df))
# 按列检测缺失值数量
print("\n=== 每列非缺失值数量 ===")
print(df.notna().sum())
# 按行检测缺失值数量
print("\n=== 每行非缺失值数量 ===")
print(df.notna().sum(axis=1))
# 计算缺失值比例
print("\n=== 缺失值比例 ===")
missing_ratio = df.isna().mean()
print(missing_ratio)
import numpy as np
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana'],
'age': [25, np.nan, 30, 28],
'score': [85, 90, np.nan, 95]
})
print("=== 原始 DataFrame ===")
print(df)
# 检测整个 DataFrame
print("\n=== pd.notna() 检测结果 ===")
print(pd.notna(df))
# 按列检测缺失值数量
print("\n=== 每列非缺失值数量 ===")
print(df.notna().sum())
# 按行检测缺失值数量
print("\n=== 每行非缺失值数量 ===")
print(df.notna().sum(axis=1))
# 计算缺失值比例
print("\n=== 缺失值比例 ===")
missing_ratio = df.isna().mean()
print(missing_ratio)
运行结果预期:
=== 原始 DataFrame ===
name age score
0 Alice 25 85.0
1 Bob NaN 90.0
2 None 30 NaN
3 Diana 28 95.0
=== pd.notna() 检测结果 ===
name age score
0 True True True
1 True False True
2 False True False
3 True True True
=== 每列非缺失值数量 ===
name 3
age 3
score 3
=== 每行非缺失值数量 ===
0 3
1 2
2 1
3 3
=== 缺失值比例 ===
name 0.25
age 0.25
score 0.25
代码解析:
pd.notna(df)返回与原 DataFrame 形状相同的布尔 DataFrame,每个位置标识是否为非缺失值。df.notna().sum()统计每列非缺失值的数量。df.isna().mean()计算每列缺失值的比例,帮助评估数据质量。
提示:
pd.notna()与pd.isna()是互为相反的关系。pd.notna()返回 True 的位置,pd.isna()返回 False,反之亦然。

Pandas 常用函数