Панды / Numpy NaN Нет сравнения - PullRequest
       7

Панды / Numpy NaN Нет сравнения

0 голосов
/ 21 сентября 2018

Почему в 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 Ответ

0 голосов
/ 23 сентября 2018

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

Панды / Нампи не имеют этой проблемы:

>>> pd.Series([np.NaN]).eq(pd.Series([np.NaN]))[0], (pd.Series([np.NaN]) == pd.Series([np.NaN]))[0]
(False, False)

Хотя специальный равен метод обрабатывает NaN s в том же месте, что и равно.

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

...