やましなぶろぐ

2つのpandas.DataFrameを比較する

equalsとcompareを使いこなす

利用局面が多いが使いたいときに少し迷うDataFrameの比較方法

🕒 Last mod: 2021-04-27


1. DataFrameの比較

2つのデータフレームが等しいのかどうか確認したいことがある。

簡単そうだけれどもいざやってみようとするとどう対応してよいか迷う。

今回はequalsとcompareを使用した対応方法を整理する。

2. テストデータ作成

微妙に違う2つのデータフレームを作成します。

data.py
df1 = pd.DataFrame(
    dict(
        a=[2, 4, 6],
        b=[1, 2, 3],
        c=[3, 6, 9],
    )
)
df2 = pd.DataFrame(
    dict(
        a=[2, 40, 6],
        b=[10, 2, 3],
        c=[3, 6, 9],
    )
)

3. 2つのデータフレームが一致しているか?

equalsを使用する

equals.py
df1.equals(df2)
# False

4. 値の違うindexとcolumnを特定する

compareを使用する

compare.py
df_comp = df1.compare(df2)
df_comp
output
a          b
self other self other
0  NaN   NaN  1.0  10.0
1  4.0  40.0  NaN   NaN

4.1. compareの結果から差のある列を特定する

compareの結果が少し扱いづらいので少し工夫する

columns.py
diff_col = df_comp.columns.droplevel(1).unique()
diff_col
output
Index(['a', 'b'], dtype='object')

4.2. compareの結果から列を指定して違いのある行を特定する

これも少し工夫する

rows_a.py
df_comp.a.dropna()
output
       self  other
   1   4.0   40.0
rows_b.py
df_comp.b.dropna()
output
       self  other
   0   1.0   10.0

5. すべてのコード

rows_b.py
import pandas as pd

df1 = pd.DataFrame(
    dict(
        a=[2, 4, 6],
        b=[1, 2, 3],
        c=[3, 6, 9],
    )
)
df2 = pd.DataFrame(
    dict(
        a=[2, 40, 6],
        b=[10, 2, 3],
        c=[3, 6, 9],
    )
)

df1.equals(df2)

df_comp = df1.compare(df2)

diff_col = df_comp.columns.droplevel(1).unique()
diff_col

df_comp.a.dropna()
df_comp.b.dropna()