在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集合中的行为。
答案 0 :(得分: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')]
设为False
。
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
在相同位置视为等号。
>>> 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