10 votes

Comparer les séries de pandas pour l'égalité lorsqu'elles contiennent des nan ?

Mon application doit comparer des instances de Series qui contiennent parfois des nans. Cela entraîne une comparaison ordinaire utilisant == d'échouer, puisque nan != nan :

import numpy as np
from pandas import Series
s1 = Series([1,np.nan])
s2 = Series([1,np.nan])

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

Quelle est la bonne façon de comparer ces séries ?

9voto

Andy Hayden Points 38010

Que diriez-vous de ceci ? Vérifiez tout d'abord que les NaNs sont au même endroit (à l'aide de 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

Vérifiez ensuite que les valeurs qui ne sont pas NaN sont égales (en utilisant 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

Pour être égaux, nous avons besoin que les deux soient vrais :

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

Vous pouvez également vérifier le nom, etc. si cela ne suffit pas.

Si vous voulez soulever s'ils sont différents, utilisez assert_series_equal de pandas.util.testing :

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

In [22]: assert_series_equal(s1, s2)

7voto

Sam Points 607

Actuellement, on devrait simplement utiliser series1.equals(series2) voir docs . Cela permet également de vérifier si nan sont dans les mêmes positions.

-1voto

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X