【pandas】異なるデータを結合するpd.merge関数の使い方

pd.merge()関数は、2つのデータフレームからキーを指定し結合するときに使われます。SQLのテーブル結合のようなもので、例えば

  • メールアドレスをキーとして顧客情報を結合
  • 売上情報と会社情報を結合

などExcelでVlookUp関数を使うような処理を自動化できます。
引数によって結合方法が変わりますので、ご紹介いたします。

import numpy as np
import pandas as pd
from pandas import DataFrame

pandasnumpyをインポートしておきます。

df1 = pd.DataFrame({
    "key":["a","b","b","d","b"],
    "num":["one","two","three","four","five"]
})
df1
keynum
a one
btwo
bthree
dfour
bfive
df2 = pd.DataFrame({
    "key":["b","c","d"],
    "data":np.arange(3)
})
df2
keydata
b0
c1
d2

結合用ファイルとして「df1」と「df2」の多対1のデータを用意しました。

目次

データフレームのみ—pd.merge(df1,df2)

pd.merge()関数では第1引数と第2引数にデータフレームを指定する。

df_merge = pd.merge(df1, df2)
df_merge
keynumdata
btwo0
bthree0
bfive0
dfour2

「多対1」で結合する場合には、df1とdf2が共通する値を持っているデータ行のみ抽出されます。

明示的に結合するキーを指定する—引数「on」

pd.merge(df1, df2, on="key")としてon=”キーとなる列名”を明示的に指定できます。

df_merge = pd.merge(df1, df2, on="key")
df_merge
keynumdata
btwo0
bthree0
bfive0
dfour2

結果は明示しない場合と同じ結果になるが、どの列をキーにしているか分かりやすいので基本的には記載する。

結合方法を指定—引数「how」

howで引数を指定すると、データの結合方法を指定できます。
引数を指定しない場合はデフォルトで内部結合「inner」になります。

how=”inner”「内部結合:inner_join」

df_merge = pd.merge(df1, df2, on="key", how="inner")
df_merge
keynumdata
btwo0
bthree0
bfive0
dfour2

howで引数を指定しない場合と一緒になります。

how=”left”「左結合:left_join」

df_merge = pd.merge(df1, df2, on="key", how="left")
df_merge
keynumdata
aoneNaN
btwo0.0
bthree0.0
dfour2.0
bfive0.0

df1のデータを基準として、df2に値が無い場合には欠損値NaNが入ります。

how=”right”「右結合:right_join」

df_merge = pd.merge(df1, df2, on="key", how="right")
df_merge
keynumdata
btwo0
bthree0
bfive0
cNaN1
dfour2

左結合と同様に、df2を基準としています。

how=”outer”「外部結合:outer_join」

df_merge = pd.merge(df1, df2, on="key", how="outer")
df_merge
keynumdata
aoneNaN
btwo0.0
bthree0.0
bfive0.0
dfour2.0
cNaN1.0

結合キーに対して、2つのデータフレームを使いたい場合に用います。

列のキーが複数共通している場合

下記データを用意しました。

df_left = DataFrame({
    "id":[1,2,3],
    "class":["A","B","C"],
    "left_name":["take","hosi","mame"]
})
df_left
idclassleft_name
01Atake
12Bhosi
33Cmame
df_right = DataFrame({
    "id":[1,1,2,3,3],
    "class":["A","B","C","C","d"],
    "right_name":["sato","bob","mary","chris","hi"]
})
df_right
idclassright_name
01Asato
11Bbob
22Cmary
33Cchris
43dhi

idをキーとして結合してみます。

df_all = pd.merge(df_left,df_right, on="id")
df_all
idclass_xleft_nameclass_yright_name
01AtakeAsato
11AtakeAbob
22BhosiCmary
33CmameCchris
43Cmamedhi

“class”列がそれぞれ「class_x」と「class_y」がついた列名に別れました。
どちらのデータの列かを区別するためにpandasがやってくれています。

共通のキーとして指定する場合には、on=["キー"]で複数のキーを指定します。

df_all = pd.merge(df_left,df_right, on=["id","class"], how="outer")
df_all
idclassleft_nameright_name
01Atakesato
12BhosiNaN
23Cmamechris
31BNaNbob
42CNaNmary
53dNaNhi

これで「id」と「class」が共通のキーとして扱えました。

参考

pandas公式ドキュメント:pandas.DataFrame.merge

機械学習・データ処理を学ぶのにおすすめの教材

動画で学習するなら!

本気で取り組むならまずは相談!

じっくり書籍で学習するなら!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる