Pandas / Numpy中NaN和None的比较

8
在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 

这个答案解释了为什么在一般情况下NaN == NaN的结果是False,但没有解释它在Python/Pandas集合中的行为。


1
我认为链接的帖子并没有给出与Python集合中np.NaN内部工作相关的答案。如果NaN!= NaN,那么为什么在Python中[NaN] == [NaN] - hellpanderr
1
这个有帮助吗? https://dev59.com/dWIj5IYBdhLWcg3wYkNY - John Zwinck
1个回答

6

此处此处Python文档所解释的那样,检查序列相等性时首先比较元素标识(identity),仅对不同元素执行元素比较。

因为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 方法之间存在不一致性,详见这里讨论:
>>> pd.Series([None, None]).eq(pd.Series([None, None]))
0    True
1    True
dtype: bool

测试于 pandas: 0.23.4 numpy: 1.15.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接