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