本記事では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 |
コードの内容は以下のとおりです.
- DataFrameを結合
- 各price列同士の一致を確認し,結果を新しい列として追加
- 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()
はここで紹介した以外でも色々と使えるので,使えると便利です.
-
例えば「いくら」は
df1
には存在しますが,df2
には存在しないので,price_y
(=df2
のprice
列)はNaN
となっています. ↩