Pandas/Numpy NaN 无比较

Posted

技术标签:

【中文标题】Pandas/Numpy NaN 无比较【英文标题】:Pandas/Numpy NaN None comparison 【发布时间】:2019-02-25 10:17:03 【问题描述】:

在 Python Pandas 和 Numpy 中,为什么比较结果不同?

from pandas import Series
from numpy import NaN

NaN 不等于NaN

>>> NaN == NaN
False

NaN 在列表或元组中是

>>> [NaN] == [NaN], (NaN,) == (NaN,)
(True, True)

虽然SeriesNaN 再次不相等:

>>> Series([NaN]) == Series([NaN])
0    False
dtype: bool

还有None:

>>> None == None, [None] == [None]
(True, True)

虽然

>>> Series([None]) == Series([None])
0    False
dtype: bool 

This answer 解释了NaN == NaN 一般为False 的原因,但没有解释其在 python/pandas 集合中的行为。

【问题讨论】:

我不认为链接的帖子给出了与 python 集合中np.NaN 的内部工作相关的答案。如果是NaN!=NaN,为什么要在python中使用[NaN]==[NaN] 这有帮助吗? ***.com/questions/20320022/… 【参考方案1】:

正如here、here 和python docs 中解释的那样,检查序列是否相等

先比较元素标识,再比较元素 仅针对不同的元素执行。

因为np.nannp.NaN 指的是同一个对象,即(np.nan is np.nan is np.NaN) == True 这个等式成立[np.nan] == [np.nan],但另一方面float('nan') 函数在每次调用时创建一个新对象,所以[float('nan')] == [float('nan')] 是@987654332 @。

Pandas/Numpy 没有这个问题:

>>> pd.Series([np.NaN]).eq(pd.Series([np.NaN]))[0], (pd.Series([np.NaN]) == pd.Series([np.NaN]))[0]
(False, False)

虽然特殊的equals 方法将位于同一位置的NaNs 视为平等。

>>> pd.Series([np.NaN]).equals(pd.Series([np.NaN]))
True

None 被区别对待。 numpy 认为它们是平等的:

>>> pd.Series([None, None]).values == (pd.Series([None, None])).values
array([ True,  True])

pandas 没有

>>> pd.Series([None, None]) == (pd.Series([None, None]))
0    False
1    False
dtype: bool

还有==操作符和eq方法的不一致,讨论here:

>>> pd.Series([None, None]).eq(pd.Series([None, None]))
0    True
1    True
dtype: bool

pandas: 0.23.4 numpy: 1.15.0测试

【讨论】:

以上是关于Pandas/Numpy NaN 无比较的主要内容,如果未能解决你的问题,请参考以下文章

pandas numpy处理缺失值,none与nan比较

如何在 pandas/numpy 中将值扩展到下一个非空值? [复制]

Pandas / Numpy - 如何获取和比较每列与每列的计数并写入 csv?

python(pandas模块)?

Pandas教程像写SQL一样用Pandas~

numpy pandas1