[pandas]pd.mergeで名前の違うカラム名で外部結合する
Contents
はじめに
pd.mergeを使っていて少しハマったのでメモ。
「2つのDataFrameを、異なる名前のカラムをキーに外部結合したい」というケース。
TL;DR
pd.merge()のleft_on
とright_on
が使えそうですが、
- どちらかのDataFrameのカラム名を変更する
- 列をコピーして名前を変える(結合用の列を作る)
などの下処理でカラム名を統一して、on
で結合する、
というのが無難ですが確実なやり方になります。
やりたいこと
例えば以下のようなデータがあったとします。
>>> print(df_1)
code value
A 10
B 100
C 200
D 300
G 1000
>>> print(df_2)
cd name
A hoge
B fuga
C piyo
D foo
E bar
codeとcdをキーに結合して、以下のような結果を得たいというのが今回のケース。
code value name
0 A 10.0 hoge
1 B 100.0 fuga
2 C 200.0 piyo
3 D 300.0 foo
4 G 1000.0 NaN
5 E NaN bar
left/right_onを使ってみる
異なるカラムをキーに指定できるleft_on, right_onというオプションがあるので使ってみます。
# outer
>>> pd.merge(df_1, df_2, left_on='code', right_on='cd', how='outer')
code value cd name
0 A 10.0 A hoge
1 B 100.0 B fuga
2 C 200.0 C piyo
3 D 300.0 D foo
4 G 1000.0 NaN NaN
5 NaN NaN E bar
4,5行目のように、キーとなるカラムにNaNが入ります。(そりゃそうです)
howオプションを変えてみる
ちなみにhowの中身を変えると以下のようになります。
# デフォルト(how='inner')
>>> pd.merge(df_1, df_2, left_on='code', right_on='cd')
code value cd name
0 A 10 A hoge
1 B 100 B fuga
2 C 200 C piyo
3 D 300 D foo
# leftで結合
>>> pd.merge(df_1, df_2, left_on='code', right_on='cd', how='left')
code value cd name
0 A 10 A hoge
1 B 100 B fuga
2 C 200 C piyo
3 D 300 D foo
4 G 1000 NaN NaN
# rightで結合
>>> pd.merge(df_1, df_2, left_on='code', right_on='cd', how='right')
code value cd name
0 A 10.0 A hoge
1 B 100.0 B fuga
2 C 200.0 C piyo
3 D 300.0 D foo
4 NaN NaN E bar
いずれにせよ、目的の結果は得られません。
カラム名変更するのが手っ取り早い
結合した後のことを考えるとcode, cdのどちらかに統一するのが使いやすくなるので、違う名前のまま結合するよりさっさとカラム名を変更した方が早そうです。
>>> df_2_ = df_2.rename(columns={'cd':'code'})
>>> pd.merge(df_1, df_2_, on='code', how='outer')
code value name
0 A 10.0 hoge
1 B 100.0 fuga
2 C 200.0 piyo
3 D 300.0 foo
4 G 1000.0 NaN
5 E NaN bar
まとめ
DataFrameの結合はいまだにググりながらやっているところがありますが、覚えて使えるようになった方が明らかに良いので参考リンク読みつつ勉強します。
ディスカッション
コメント一覧
まだ、コメントがありません