非空值处理
空值的处理: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。