search
LoginSignup
4

posted at

【Pandas】両者のDataframeの差分を確認したい!

同じカラムだけど、データ量が違う2つのdataframeがあったとする。

  • dataframe 1
index a b c
0 1 2 3
1 4 5 6
  • dataframe 2
index a b c
0 1 2 3
1 4 5 6
2 5 6 7

データ量が同じであれば、compare関数を使うことができるが、
両者のデータ量が異なる場合、compare関数を利用すると
エラーとなってしまう。

ValueError: Can only compare identically-labeled DataFrame objects

そこで、両者のどこに差があるのかを確認する方法を紹介する。

差分の確認方法

以下のように、merge関数とquery関数をくみあわせればいい。

pd.merge(df1,df2, on=["両者を紐付けるカラム名1", "両者を紐付けるカラム名2"], how ="outer", indicator=True).query(f'_merge != "both"')

上の式は何をやっているかというと、
両者のDataFrameを外部結合する。merge関数のindicatorをTrueにしておくと、

  • 両者に同じデータがある部分には, both
  • 右のDataFrameにだけデータがある場合は, right_only
  • 左のDataFrameにだけデータがある場合は, left_only

が記載される。

このデータフレームからquery関数を利用して、両者同じデータがない部分のデータだけを抜き出してくる

先程の上の2つのdataframeでみてみる。

import pandas as pd
df1 = pd.DataFrame({'a': [1, 4], 'b': [2, 5], 'c': [3, 6]})
df2 = pd.DataFrame({'a': [1, 4, 5], 'b': [2, 5,6], 'c': [3, 6, 7]})

pd.merge(df1,df2, on=["a","b","c"],how='outer',indicator=True)

結果はいかのようになり、右側つまり、dataframe2にだけ5,6,7のデータが余分に存在することがわかる。

index a b c _merge
2 5 6 7 right_only

まとめ

両者のdataframe(df1, df2)の差分確認方法

pd.merge(df1,df2, on=["両者を紐付けるカラム名1", "両者を紐付けるカラム名2"], how ="outer", indicator=True).query(f'_merge != "both"')

最後に

今回は、両者のデータフレームの差分の確認方法について紹介しました。
なにか疑問点等ありましたら、コメントお待ちしております。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4