【Pandas】pandas DataFrame notna
Pandas2.2 DataFrame
Missing data handling
方法 | 描述 |
---|---|
DataFrame.fillna([value, method, axis, …]) | 用于填充 DataFrame 中的缺失值(NaN) |
DataFrame.backfill(*[, axis, inplace, …]) | 用于**使用后向填充(即“下一个有效观测值”)来填补缺失值(NaN)**的方法 |
DataFrame.bfill(*[, axis, inplace, limit, …]) | 用于**使用后向填充(即“下一个有效观测值”)来填补缺失值(NaN)**的方法 |
DataFrame.dropna(*[, axis, how, thresh, …]) | 用于删除包含缺失值(NaN)的行或列的方法 |
DataFrame.ffill(*[, axis, inplace, limit, …]) | 用于**使用前向填充(即“前一个有效观测值”)来填补缺失值(NaN)**的方法 |
DataFrame.interpolate([method, axis, limit, …]) | 用于对缺失值(NaN)进行插值填充的方法 |
DataFrame.isna() | 用于检测 DataFrame 中缺失值(NaN)的位置的方法 |
DataFrame.isnull() | 用于检测 DataFrame 中缺失值(NaN)的位置的方法 |
DataFrame.notna() | 用于检测 DataFrame 中非缺失值(即不是 NaN)的位置的方法 |
pandas.DataFrame.notna()
pandas.DataFrame.notna()
是一个用于检测 DataFrame 中非缺失值(即不是 NaN)的位置的方法。它返回一个新的布尔型 DataFrame
,其中每个元素表示对应位置的值是否为非空值(not NaN)。
📌 方法签名
DataFrame.notna()
✅ 返回值
- 返回一个与原
DataFrame
形状相同的布尔型DataFrame
; - 若某个位置是非空值(即不是
NaN
),则对应位置为True
; - 否则为
False
。
该方法不会修改原始数据。
❌ 注意事项
notna()
不支持参数;- 它仅用于检测
NaN
,不识别None
或其他空值(如空字符串、0 等); notna()
与isna()
/isnull()
完全相反;- 常用于过滤掉缺失值或统计有效值数量。
🧪 示例代码及结果
示例 1:基本用法
import pandas as pd
import numpy as npdf = pd.DataFrame({'A': [1, np.nan, 3],'B': [np.nan, 2, np.nan],'C': [5, 6, 7]
})print("Original DataFrame:")
print(df)# 检测非空值位置
df_notna = df.notna()
print("\nAfter notna():")
print(df_notna)
输出结果:
Original DataFrame:A B C
0 1.0 NaN 5
1 NaN 2.0 6
2 3.0 NaN 7After notna():A B C
0 True False True
1 False True True
2 True False True
示例 2:统计每列的有效值数量
# 统计每列非空值的数量
valid_count = df.notna().sum()
print("\nValid value count per column:")
print(valid_count)
输出结果:
Valid value count per column:
A 2
B 1
C 3
dtype: int64
示例 3:统计整个 DataFrame 中的有效值总数
total_valid = df.notna().sum().sum()
print(f"\nTotal valid values: {total_valid}")
输出结果:
Total valid values: 6
示例 4:筛选出所有非空行(即整行都没有 NaN)
# 筛选整行都非空的行
full_rows = df[df.notna().all(axis=1)]
print("\nRows with no missing values:")
print(full_rows)
输出结果:
Rows with no missing values:A B C
因为没有任何一行是全部非空的,所以输出为空。
示例 5:筛选出至少有一个非空值的行
# 筛选至少有一个非空值的行
some_valid_rows = df[df.notna().any(axis=1)]
print("\nRows with at least one valid value:")
print(some_valid_rows)
输出结果:
Rows with at least one valid value:A B C
0 1.0 NaN 5
1 NaN 2.0 6
2 3.0 NaN 7
🧠 应用场景
场景 | 说明 |
---|---|
查看有效值分布 | 快速了解哪些位置有有效数据 |
统计有效值数量 | 结合 sum() 计算每列/行的有效值个数 |
过滤含缺失值的行/列 | 使用 df.notna().all(axis=1) 配合布尔索引 |
预处理流程的一部分 | 判断某列是否适合填充或删除 |
⚠️ 补充说明
notna()
与isna()
/isnull()
完全互为反义操作;- 对于非浮点类型列(如字符串、整数),若含有
NaN
,也会被标记为False
; - 如果你希望将
None
视为NaN
,可以先使用df.replace([None], np.nan)
转换。
✅ 总结对比
方法 | 是否推荐使用 | 说明 |
---|---|---|
notna() | ✅ 推荐 | 更直观地表达“是否为有效值” |
~isna() | ✅ 推荐 | 与 notna() 等价,可用于取反操作 |
~isnull() | ✅ 推荐 | 与 notna() 等价,兼容性考虑 |
你可以将 notna()
作为日常数据清洗的重要工具之一,尤其在需要保留完整记录或统计有效数据量时非常有用。