【pandas】異なるデータを結合するpd.merge関数の使い方
pd.merge()関数は、2つのデータフレームからキーを指定し結合するときに使われます。SQLのテーブル結合のようなもので、例えば
- メールアドレスをキーとして顧客情報を結合
- 売上情報と会社情報を結合
などExcelでVlookUp関数を使うような処理を自動化できます。
引数によって結合方法が変わりますので、ご紹介いたします。
import numpy as np
import pandas as pd
from pandas import DataFrame
pandas
とnumpy
をインポートしておきます。
df1 = pd.DataFrame({
"key":["a","b","b","d","b"],
"num":["one","two","three","four","five"]
})
df1
key | num |
---|---|
a | one |
b | two |
b | three |
d | four |
b | five |
df2 = pd.DataFrame({
"key":["b","c","d"],
"data":np.arange(3)
})
df2
key | data |
---|---|
b | 0 |
c | 1 |
d | 2 |
結合用ファイルとして「df1」と「df2」の多対1のデータを用意しました。
データフレームのみ—pd.merge(df1,df2)
pd.merge()
関数では第1引数と第2引数にデータフレームを指定する。
df_merge = pd.merge(df1, df2)
df_merge
key | num | data |
---|---|---|
b | two | 0 |
b | three | 0 |
b | five | 0 |
d | four | 2 |
「多対1」で結合する場合には、df1とdf2が共通する値を持っているデータ行のみ抽出されます。
明示的に結合するキーを指定する—引数「on」
pd.merge(df1, df2, on="key")
としてon=”キーとなる列名”を明示的に指定できます。
df_merge = pd.merge(df1, df2, on="key")
df_merge
key | num | data |
---|---|---|
b | two | 0 |
b | three | 0 |
b | five | 0 |
d | four | 2 |
結果は明示しない場合と同じ結果になるが、どの列をキーにしているか分かりやすいので基本的には記載する。
結合方法を指定—引数「how」
how
で引数を指定すると、データの結合方法を指定できます。
引数を指定しない場合はデフォルトで内部結合「inner」
になります。
how=”inner”「内部結合:inner_join」
df_merge = pd.merge(df1, df2, on="key", how="inner")
df_merge
key | num | data |
---|---|---|
b | two | 0 |
b | three | 0 |
b | five | 0 |
d | four | 2 |
how
で引数を指定しない場合と一緒になります。
how=”left”「左結合:left_join」
df_merge = pd.merge(df1, df2, on="key", how="left")
df_merge
key | num | data |
---|---|---|
a | one | NaN |
b | two | 0.0 |
b | three | 0.0 |
d | four | 2.0 |
b | five | 0.0 |
df1のデータを基準として、df2に値が無い場合には欠損値NaN
が入ります。
how=”right”「右結合:right_join」
df_merge = pd.merge(df1, df2, on="key", how="right")
df_merge
key | num | data |
---|---|---|
b | two | 0 |
b | three | 0 |
b | five | 0 |
c | NaN | 1 |
d | four | 2 |
左結合と同様に、df2を基準としています。
how=”outer”「外部結合:outer_join」
df_merge = pd.merge(df1, df2, on="key", how="outer")
df_merge
key | num | data |
---|---|---|
a | one | NaN |
b | two | 0.0 |
b | three | 0.0 |
b | five | 0.0 |
d | four | 2.0 |
c | NaN | 1.0 |
結合キーに対して、2つのデータフレームを使いたい場合に用います。
列のキーが複数共通している場合
下記データを用意しました。
df_left = DataFrame({
"id":[1,2,3],
"class":["A","B","C"],
"left_name":["take","hosi","mame"]
})
df_left
id | class | left_name | |
---|---|---|---|
0 | 1 | A | take |
1 | 2 | B | hosi |
3 | 3 | C | mame |
df_right = DataFrame({
"id":[1,1,2,3,3],
"class":["A","B","C","C","d"],
"right_name":["sato","bob","mary","chris","hi"]
})
df_right
id | class | right_name | |
---|---|---|---|
0 | 1 | A | sato |
1 | 1 | B | bob |
2 | 2 | C | mary |
3 | 3 | C | chris |
4 | 3 | d | hi |
id
をキーとして結合してみます。
df_all = pd.merge(df_left,df_right, on="id")
df_all
id | class_x | left_name | class_y | right_name | |
---|---|---|---|---|---|
0 | 1 | A | take | A | sato |
1 | 1 | A | take | A | bob |
2 | 2 | B | hosi | C | mary |
3 | 3 | C | mame | C | chris |
4 | 3 | C | mame | d | hi |
“class”列がそれぞれ「class_x」と「class_y」がついた列名に別れました。
どちらのデータの列かを区別するためにpandas
がやってくれています。
共通のキーとして指定する場合には、on=["キー"]
で複数のキーを指定します。
df_all = pd.merge(df_left,df_right, on=["id","class"], how="outer")
df_all
id | class | left_name | right_name | |
---|---|---|---|---|
0 | 1 | A | take | sato |
1 | 2 | B | hosi | NaN |
2 | 3 | C | mame | chris |
3 | 1 | B | NaN | bob |
4 | 2 | C | NaN | mary |
5 | 3 | d | NaN | hi |
これで「id」と「class」が共通のキーとして扱えました。
参考
pandas公式ドキュメント:pandas.DataFrame.merge
機械学習・データ処理を学ぶのにおすすめの教材
じっくり書籍で学習するなら!
コメント