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)
虽然Series
和NaN
再次不相等:
>>> 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.nan
和np.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 方法将位于同一位置的NaN
s 视为平等。
>>> 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 中将值扩展到下一个非空值? [复制]