19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pd.mergeでindicatorを使おう

Last updated at Posted at 2019-12-22

概要

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
スクリーンショット 2019-12-22 11.58.39.png
b
スクリーンショット 2019-12-22 11.58.45.png

何も考えずに分析する場合、

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
スクリーンショット 2019-12-22 12.14.25.png

すると上記のように結合後データセットと共に_mergeカラムが追加されます。
_mergeカラムにはboth, left_only, right_onlyのいずれかの値が入っており、そのレコードがどこから来たレコードなのかを教えてくれます。あとはこのカラムを利用して、

c_left_only = c[c["_merge"]=="left_only"]
c_left_only
スクリーンショット 2019-12-22 12.21.01.png とすると身長はあるけど体重はない人の一覧を取得することができます。

merge時にはhow="outer"にしておいて、後で目的に応じてこのように"_merge"の値でデータを抽出するのが便利です。

また、indicatorはboolだけでなく、str型も対応しており、

d = a.merge(b, on="ID", how="outer", indicator="flg_weight")
d
スクリーンショット 2019-12-22 12.22.58.png `_merge`の部分を指定した文字列にすることができます。

便利な機能なのでぜひ使っていただきたいです!
それではよいデータ分析ライフを~~

19
16
0

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
  3. You can use dark theme
What you can do with signing up
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?