2つのデータフレームを比較して違いを取得する [重複] 質問する

2つのデータフレームを比較して違いを取得する [重複] 質問する

2 つのデータフレームがあります。例:

df1:
Date       Fruit  Num  Color 
2013-11-24 Banana 22.1 Yellow
2013-11-24 Orange  8.6 Orange
2013-11-24 Apple   7.6 Green
2013-11-24 Celery 10.2 Green

df2:
Date       Fruit  Num  Color 
2013-11-24 Banana 22.1 Yellow
2013-11-24 Orange  8.6 Orange
2013-11-24 Apple   7.6 Green
2013-11-24 Celery 10.2 Green
2013-11-25 Apple  22.1 Red
2013-11-25 Orange  8.6 Orange

各データフレームにはインデックスとして日付があります。両方のデータフレームは同じ構造を持ちます。

私がやりたいのは、これら 2 つのデータフレームを比較して、df2 にある行のうち df1 にはない行を見つけることです。日付 (インデックス) と最初の列 (Banana、APple など) を比較して、それらが df2 と df1 に存在するかどうかを確認します。

私は次のことを試しました:

最初のアプローチでは、次のエラーが発生します:「例外: 同じラベルの DataFrame オブジェクトのみを比較できます」インデックスとしての日付を削除しようとしましたが、同じエラーが発生します。

上の3番目のアプローチ、アサートは False を返しますが、実際にさまざまな行を確認する方法がわかりません。

何かアドバイスがあれば歓迎します

ベストアンサー1

このアプローチはdf1 != df2、行と列が同一のデータフレームに対してのみ機能します。実際、すべてのデータフレームの軸は_indexed_sameメソッドと比較され、列/インデックスの順序であっても違いが見つかった場合は例外が発生します。

私の理解が正しければ、変更点ではなく対称的な差異を見つけたいはずです。その場合、データフレームを連結するという方法があります。

>>> df = pd.concat([df1, df2])
>>> df = df.reset_index(drop=True)

グループ化

>>> df_gpby = df.groupby(list(df.columns))

一意のレコードのインデックスを取得する

>>> idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]

フィルター

>>> df.reindex(idx)
         Date   Fruit   Num   Color
9  2013-11-25  Orange   8.6  Orange
8  2013-11-25   Apple  22.1     Red

おすすめ記事