Pandas/Numpy NaN Нет сравнения

В 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.


person Chas    schedule 21.09.2018    source источник
comment
Я не думаю, что связанный пост дает ответ, относящийся к внутренней работе np.NaN в коллекциях Python. Если NaN!=NaN, то почему [NaN]==[NaN] в питоне?   -  person hellpanderr    schedule 21.09.2018
comment
Это помогает? stackoverflow.com/questions/20320022/   -  person John Zwinck    schedule 22.09.2018


Ответы (1)


Как объяснено здесь и здесь и в документы 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.

Панды/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

person hellpanderr    schedule 23.09.2018