概要
pandasでmergeする際にindicator
という引数があるのですが、とても便利であるにも関わらず使用している方が少ない気がするので布教したい目的の記事です。
ドキュメントには以下のように記載があります。
indicator : bool or str, default False
If True, adds a column to output DataFrame called “_merge” with information on the source of each row. If string, column with information on source of each row will be added to output DataFrame, and column will be named value of string. Information column is Categorical-type and takes on a value of “left_only” for observations whose merge key only appears in ‘left’ DataFrame, “right_only” for observations whose merge key only appears in ‘right’ DataFrame, and “both” if the observation’s merge key is found in both.
一般的にleft joinすると左側のデータにしか存在しないレコードはmergeの際に全部欠損になってしまいます。ですが、データ分析の際にはどのレコードには紐づいて、どのレコードには紐づかない、という紐付き具合などを見たいケースがよくあります。普通にmergeするとこれを確認するのが結構面倒だったり後で全然紐づいてないことに気づいて惨事になるのですがこの記事で紹介するindicator
を用いるとこれが簡単に確認できるようになります。
普段分析する対象が自社内データだけで、全てのデータがkeyで完全に紐づくなら特に問題はないのですが、外部からよく知らないデータを引っ張ってきて自社保有データと紐付ける際などに重宝します。
具体例で見てみます。
具体例
自分が保有している身長データaに外から拾ってきた体重データbをくっつけるとします。
a = pd.DataFrame({
"ID" : [1, 2, 3, 4, 6],
"name": ["Tom", "Bob", "Alex", "Mike", "John"],
"heigt": [169, 173, 163, 170, 182]
})
b = pd.DataFrame({
"ID" : [1, 2, 3, 4, 5],
"weight": [65, 70, 72, 58, 61]
})
a
b
何も考えずに分析する場合、
c = a.merge(b, on="ID", how="left")
# or
c = a.merge(b, on="ID", how="inner")
を目的に応じてやればいいと思います。
ここではbが外部から持ってきたデータなので以下のことが知りたいとします。
- aとbはどれぐらい紐づくのか?
- a(b)がくっつかないレコードの詳細を見たい
これを簡単に確認できるのがindicator
オプションになります。
使用法は簡単で、以下のようにindicator=True
を追加するだけです。
(結合keyの重複確認についてはここでは触れません)
c = a.merge(b, on="ID", how="outer", indicator=True)
c
すると上記のように結合後データセットと共に_merge
カラムが追加されます。
_merge
カラムにはboth
, left_only
, right_only
のいずれかの値が入っており、そのレコードがどこから来たレコードなのかを教えてくれます。あとはこのカラムを利用して、
c_left_only = c[c["_merge"]=="left_only"]
c_left_only
merge時にはhow="outer"にしておいて、後で目的に応じてこのように"_merge"の値でデータを抽出するのが便利です。
また、indicator
はboolだけでなく、str型も対応しており、
d = a.merge(b, on="ID", how="outer", indicator="flg_weight")
d
便利な機能なのでぜひ使っていただきたいです!
それではよいデータ分析ライフを~~