Pandas / Numpy NaN无比较

时间:2018-09-21 03:53:16

标签: python python-3.x pandas nan nonetype

在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集合中的行为。

1 个答案:

答案 0 :(得分:1)

herehere所述,并在python docs中检查序列是否相等

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

因为np.nannp.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

的测试