[pandas]pd.mergeで名前の違うカラム名で外部結合する

はじめに

pd.mergeを使っていて少しハマったのでメモ。

「2つのDataFrameを、異なる名前のカラムをキーに外部結合したい」というケース。

TL;DR

pd.merge()のleft_onright_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の結合はいまだにググりながらやっているところがありますが、覚えて使えるようになった方が明らかに良いので参考リンク読みつつ勉強します。

参考