Сравнивая pandas. Серии для равенства, когда они содержат nan?

131
9

Мое приложение должно сравнивать экземпляры Series, которые иногда содержат nans. Основная проблема заключается в том, что:


>>> (Series([1, nan]) == Series([1, nan])).all()
False

Так как nan != nan. Каков правильный способ сравнения таких рядов?

спросил(а) 2021-01-25T21:40:32+03:00 4 месяца, 2 недели назад
1
Решение
131

Как насчет этого. Сначала проверьте, что NaN находятся в одном месте (используя isnull):


In [11]: s1.isnull()
Out[11]:
0 False
1 True
dtype: bool

In [12]: s1.isnull() == s2.isnull()
Out[12]:
0 True
1 True
dtype: bool


Затем проверьте значения, которые не являются NaN равными (используя notnull):


In [13]: s1[s1.notnull()]
Out[13]:
0 1
dtype: float64

In [14]: s1[s1.notnull()] == s2[s2.notnull()]
Out[14]:
0 True
dtype: bool


Чтобы быть равным, нам нужно как True:

In [15]: (s1.isnull() == s2.isnull()).all() and (s1[s1.notnull()] == s2[s2.notnull()]).all()
Out[15]: True

Вы также можете проверить имя и т.д., если этого недостаточно.


Если вы хотите повысить, если они отличаются, используйте assert_series_equal от pandas.util.testing:


In [21]: from pandas.util.testing import assert_series_equal

In [22]: assert_series_equal(s1, s2)

ответил(а) 2021-01-25T21:40:32+03:00 4 месяца, 2 недели назад
45

In [16]: s1 = Series([1,np.nan])

In [17]: s2 = Series([1,np.nan])

In [18]: (s1.dropna()==s2.dropna()).all()
Out[18]: True

ответил(а) 2021-01-25T21:40:32+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема