Skip to main content

非空值处理

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

在进行数据处理时,空值的检测与处理常常让人困惑。我的目标是获取数据中的所有非零且非空值,并计算其均值,然后用该均值填充所有的 0 和空值。这让我意识到 i is None、np.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:返回 False,np.nan 不是 None。
  • type(np.nan):返回 float,np.nan 是 float 类型,尽管它表示的是一个“空值”。

总结:​

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

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

总结:​

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

另外,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。