Cha*_*has 6 python nan python-3.x pandas nonetype
在Python Pandas和Numpy中,比较结果为何不同?
from pandas import Series
from numpy import NaN
Run Code Online (Sandbox Code Playgroud)
NaN
不等于 NaN
>>> NaN == NaN
False
Run Code Online (Sandbox Code Playgroud)
但NaN
在列表或元组中是
>>> [NaN] == [NaN], (NaN,) == (NaN,)
(True, True)
Run Code Online (Sandbox Code Playgroud)
而Series
与NaN
又不相等:
>>> Series([NaN]) == Series([NaN])
0 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
和None
:
>>> None == None, [None] == [None]
(True, True)
Run Code Online (Sandbox Code Playgroud)
而
>>> Series([None]) == Series([None])
0 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
这个答案解释了原因NaN == NaN
是False
一般,但并没有解释其在python /大熊猫收藏行为。
如here、here和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)
Run Code Online (Sandbox Code Playgroud)
尽管特殊的equals方法将NaN
s 在同一位置视为等于。
>>> pd.Series([np.NaN]).equals(pd.Series([np.NaN]))
True
Run Code Online (Sandbox Code Playgroud)
None
被区别对待。numpy
认为它们相等:
>>> pd.Series([None, None]).values == (pd.Series([None, None])).values
array([ True, True])
Run Code Online (Sandbox Code Playgroud)
虽然pandas
没有
>>> pd.Series([None, None]) == (pd.Series([None, None]))
0 False
1 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
==
运算符和eq
方法之间也存在不一致,此处讨论:
>>> pd.Series([None, None]).eq(pd.Series([None, None]))
0 True
1 True
dtype: bool
Run Code Online (Sandbox Code Playgroud)
经过测试 pandas: 0.23.4 numpy: 1.15.0
归档时间: |
|
查看次数: |
730 次 |
最近记录: |