python - 読み方 - Pandas "同一ラベルのDataFrameオブジェクトのみを比較できる"エラー




python pandas 入門 (2)

私は2つのデータフレーム(uat、prod)にロードされた2つのファイルの出力を比較するためにパンダを使用しています:...

uat = uat[['Customer Number','Product']]
prod = prod[['Customer Number','Product']]
print uat['Customer Number'] == prod['Customer Number']
print uat['Product'] == prod['Product']
print uat == prod

The first two match exactly:
74357    True
74356    True
Name: Customer Number, dtype: bool
74357    True
74356    True
Name: Product, dtype: bool

3番目の印刷では、エラーが発生します。同じラベルのDataFrameオブジェクトのみを比較できます。 最初の2人が罰金を比較した場合、3人目の問題は何ですか?

ありがとう


これを実証するための小さな例があります(Pandas 0.19が両方に適用されるまで、SeriesではなくDataFramesにのみ適用されます)。

In [1]: df1 = pd.DataFrame([[1, 2], [3, 4]])

In [2]: df2 = pd.DataFrame([[3, 4], [1, 2]], index=[1, 0])

In [3]: df1 == df2
Exception: Can only compare identically-labeled DataFrame objects

1つの解決策はまず索引ソートする ことです (注: ソートされた索引が必要な機能もあります )。

In [4]: df2.sort_index(inplace=True)

In [5]: df1 == df2
Out[5]: 
      0     1
0  True  True
1  True  True

注意: ==列の順序に影響されるので、 sort_index(axis=1)を使用する必要があります。

In [11]: df1.sort_index().sort_index(axis=1) == df2.sort_index().sort_index(axis=1)
Out[11]: 
      0     1
0  True  True
1  True  True

注:これは引き続き発生する可能性があります(ソート後にインデックス/列に同じラベルが付けられていない場合)。


比較する必要がない場合は、インデックス列を削除することもできます。

print(df1.reset_index(drop=True) == df2.reset_index(drop=True))

私はこのようなテクニックを以下のような単体テストで使っています:

from pandas.util.testing import assert_frame_equal

assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))




pandas