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