2013-08-26 2 views
8

私のアプリケーションは、時にはnansを含むSeriesインスタンスを比較する必要があります。重要な問題は次のとおりです。pandas.Seriesにnanが含まれているかどうかを比較する

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

nan != nan以降です。このようなシリーズを比較する適切な方法は何ですか?

答えて

8

これはどうですか?最初の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 

等しい我々されるために両方に該当する必要があります。これが十分でなかった場合

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

あなたも名などをチェックできます。それらが異なる場合は、昇給にしたい場合は

pandas.util.testingからassert_series_equalを使用します。この作品

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

In [22]: assert_series_equal(s1, s2) 
+0

、あまりにも悪いそれだけでfalseを返すのではなく、例外が発生します。 –

+0

@DunPealは正しいことを行うアップデートを追加しました。 –

+0

これはうまくいきます。私は、Pandasがこの小さなスニペットを抽象化するメソッドをSeriesに追加するのが理にかなっていると思います。 –

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

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

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

Jeff、解決策はNaNの位置を無視します: '(Series([1、nan])。 –

+0

うん......本当に正しい方法は、上記のAndyが示すように '' assert_series_equal''です – Jeff

関連する問題