现在位置: 首页 > Pandas 教程 > 正文

Pandas pd.notna() 函数

Pandas 通用函数 Pandas 常用函数


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 中缺失值包括 NoneNaNNaT(缺失的时间类型)以及 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()}")  # 转换为列表方便查看

运行结果预期:

=== 标量检测 ===
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]

代码解析:

  1. pd.notna(10)pd.notna('runoob') 检测正常的数值和字符串,返回 True
  2. pd.notna(None)pd.notna(np.nan) 检测 Python 和 NumPy 的缺失值标记,返回 False
  3. 对列表使用 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()])

运行结果预期:

=== 原始 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)

运行结果预期:

=== 原始 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 常用函数 Pandas 常用函数