DataFrame同士の差分を確認する方法

本記事ではDataFrame同士の差分を確認する方法について解説しています.
pandasのmerge()isin()を使っています.

公式 Reference

事前準備

まずはサンプルのDataFrameを2つ作成します.


import pandas as pd

df1 = pd.DataFrame({
    'sushi': ['まぐろ', 'いくら', 'えび'],
    'price': [500, 300, 150]
})
display(df1)

df2 = pd.DataFrame({
    'sushi': ['まぐろ', 'うに', 'えび'],
    'price': [500, 400, 130]
})
display(df2)
sushi price
0 まぐろ 500
1 いくら 300
2 えび 150
sushi price
0 まぐろ 500
1 うに 400
2 えび 130

DataFrame同士の差分を横並びで確認

2つのDataFrameを横並びにして確認する場合は以下のとおりです.
sushi列を基準にDataFrameを結合しています.


pd.merge(df1, df2, how='outer', on='sushi')
sushi price_x price_y
0 まぐろ 500.0 500.0
1 いくら 300.0 NaN
2 えび 150.0 130.0
3 うに NaN 400.0

片方のDataFrameにしか存在しない要素に関してはNaNとなります.1

参考

結合したDataFrameのカラム名(price_x, price_y)を変更したい場合は以下のようにsuffixes引数を追加します.


pd.merge(df1, df2, how='outer', on='sushi', suffixes=('_df1', '_df2'))

sushi price_df1 price_df2
0 まぐろ 500.0 500.0
1 いくら 300.0 NaN
2 えび 150.0 130.0
3 うに NaN 400.0

DataFrame同士の完全一致を確認

DataFrame同士で完全に一致しているデータを見たい場合は以下のとおりです.
sushi列とprice列が一致している行だけが抽出されています.


pd.merge(df1, df2, how='inner')
sushi price
0 まぐろ 500

差分(一致しない)行だけを確認

DataFrame同士の差分を確認するには以下のようにします.


df = pd.merge(df1, df2, how='outer', on='sushi', suffixes=('_df1', '_df2'))
df['flag'] = df['price_df1'] == df['price_df2']
df.query('flag == False')
sushi price_df1 price_df2 flag
1 いくら 300.0 NaN False
2 えび 150.0 130.0 False
3 うに NaN 400.0 False

コードの内容は以下のとおりです.

  1. DataFrameを結合
  2. 各price列同士の一致を確認し,結果を新しい列として追加
  3. flag列がFalseのデータだけを抽出

片方のDataFrameを基準に両者の差分のみを確認

df1のsushi列とdf2のsushi列を比較して,df1にのみ存在する要素を表示しています.


df1[~df1['sushi'].isin(df2['sushi'])]
sushi price
1 いくら 300

df2にのみ存在する要素は以下のとおりです.


df2[~df2['sushi'].isin(df1['sushi'])]
sushi price
1 うに 400

なお,df1, df2の両方に存在する要素をsushi列基準で取得するには以下のとおりです.


df1[df1['sushi'].isin(df2['sushi'])]
sushi price
0 まぐろ 500
2 えび 150

注意

この方法では他の列(=price列)の一致は無視しています.
あくまでもsushi列同士の比較です.

ひとこと

たまに目視でDataFrame同士を見たりする際に使います.
isin()はここで紹介した以外でも色々と使えるので,使えると便利です.


  1. 例えば「いくら」はdf1には存在しますが,df2には存在しないので,price_y(=df2price列)はNaNとなっています.