Skip to main content

非空值处理

空值的处理:np.isnan() vs pd.isnull() vs i is None

在进行数据处理时,空值的检测与处理常常让人困惑。我的目标是获取数据中的所有非零且非空值,并计算其均值,然后用该均值填充所有的 0 和空值。这让我意识到 i is Nonenp.isnan(i)i.isnull() 之间的差异,下面我将做一个简单的介绍:

1. 关于 np.nan

问题:空值的唯一来源是 np.nan()

np.nan 代表“不是一个数字”(Not a Number),是 NumPy 用来表示缺失数据的标志。首先需要明确的是,空值只有 np.nan 一种形式,即使它看起来是空的,实际上它并不等同于 Python 中的 None

np.nan 的一些奇妙性质

  • np.nan == np.nan:返回 False
  • np.isnan(np.nan):返回 True,表示 np.nan 是“不是数字”。
  • np.nan is None:返回 Falsenp.nan 不是 None
  • type(np.nan):返回 floatnp.nanfloat 类型,尽管它表示的是一个“空值”。

总结:

  • np.nan 不是一个“空”对象,使用 i is None 判断会返回 False
  • 判断空值时,不能使用 i == np.nan,因为空值无法通过相等操作符正确比较。正确的做法是使用 np.isnan(i) 来检查是否是 NaN
  • np.nanfloat 类型。

2. np.isnan()pd.isnull() 的使用区别

创建一个示例 DataFrame

import pandas as pd
import numpy as np

bb = pd.DataFrame({'a': [0, 1, 2, np.nan]})
print(bb)

输出:

     a
0 0.0
1 1.0
2 2.0
3 NaN

使用 np.isnan() 检测空值

np.isnan(bb)

输出:

       a
0 False
1 False
2 False
3 True

通过 np.isnan() 可以逐元素地检测空值。但是,np.isnan() 对于 DataFrame 或 Series 的处理有点局限。若想检查整个 DataFrame 是否有空值,可以使用:

np.isnan(bb).all()

输出:

a    False
dtype: bool

使用 pd.isnull() 检测空值

pd.isnull(bb)

输出:

       a
0 False
1 False
2 False
3 True

pd.isnull() 可以用于检查 DataFrameSeries 是否存在空值,返回一个布尔值的 DataFrame 或 Series。与 np.isnan() 的不同之处在于,pd.isnull() 更加灵活,适合处理整列或整行的数据。

总结:

  • np.isnan() 通常用于单个值的空值检测,适合处理 numpy 数组单个数值
  • pd.isnull() 更适合用来检测 DataFrameSeries 中的空值。

另外,pd.isna()pd.isnull() 是完全一样的,可以互换使用。


3. 空值相关的其他函数

除了 np.isnan()pd.isnull(),Pandas 还提供了一些其他用于空值检测和处理的函数,例如:

  • notna():用于检查非空值,返回相反的布尔值。
  • fillna():用于用指定的值填充空值。
  • dropna():用于删除含有空值的行或列。

在实际应用中,选择合适的空值处理函数非常重要,可以根据具体需求来灵活使用。


4. 替换 NaN 为 0

如果你想将 NaN 替换为 0,可以使用以下代码:

if np.isnan(data).any():
data[np.isnan(data)] = 0

这段代码会检查 data 中是否存在 NaN,如果存在,就把所有的 NaN 替换为 0。