1. ホーム
  2. python

[解決済み] 2つのデータフレームを比較し、差分を取得する [重複].

2022-09-19 21:01:31

質問

2つのdataframeを持っています。 例を挙げます。

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

各データフレームはDateをインデックスとして持っています。どちらのデータフレームも同じ構造を持っています。

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

私は以下を試しました。

最初のアプローチでは、私はこのエラーを取得します。 "例外。Can only compare identically-labeled DataFrame objects" . 私はインデックスとして日付を削除しようとしましたが、同じエラーが発生します。

において 第三のアプローチ で、私はFalseを返すようにアサートしますが、実際に異なる行を見る方法を見つけ出すことができません。

どのようなポインタでも歓迎されます。

どのように解決するのですか?

この方法です。 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