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