在Python Pandas和Numpy中,为什么比较结果不同?
from pandas import Series
from numpy import NaN
NaN
不等于NaN
>>> NaN == NaN
False
但列表或元组内的NaN
是
>>> [NaN] == [NaN], (NaN,) == (NaN,)
(True, True)
虽然NaN
Series
再次不相等:
>>> Series([NaN]) == Series([NaN])
0 False
dtype: bool
None
:
>>> None == None, [None] == [None]
(True, True)
而
>>> Series([None]) == Series([None])
0 False
dtype: bool
这个答案解释了NaN == NaN
一般False
的原因,但没有解释它在python/pandas集合中的行为。
如此处、此处和 python 文档中解释的检查序列相等性
元素标识首先比较,元素比较 仅对不同元素执行。
因为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)
尽管特殊等于方法将同一位置的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
方法之间也存在不一致,此处对此进行了讨论:
>>> pd.Series([None, None]).eq(pd.Series([None, None]))
0 True
1 True
dtype: bool
经pandas: 0.23.4 numpy: 1.15.0
测试