前回の記事で、複数のデータフレームをマージする方法を紹介した。
マージの際にキーとなる列がデータフレームの列内に含まれていれば、前回紹介した方法で問題ないが、今回はインデックスをキーとして利用する場合の例を紹介する。
コンテンツ
サンプルデータフレームの用意
import pandas as pd
df_left1 = pd.DataFrame({'key': ['a', 'b', 'a', 'a', 'b', 'c'],
'value': range(6)})
# key value
# 0 a 0
# 1 b 1
# 2 a 2
# 3 a 3
# 4 b 4
# 5 c 5
df_right1 = pd.DataFrame({'group_val': [3.5, 7]}, index=['a', 'b'])
# group_val
# a 3.5
# b 7.0
インデックスによるマージ
記事冒頭にて説明した、インデックスをマージのキーとして使う場合は、left_index(right_index)オプションにTrueを設定する。
df_merge1 = pd.merge(df_left1, df_right1, left_on='key', right_index=True, how='outer')
# key value group_val
# 0 a 0 3.5
# 2 a 2 3.5
# 3 a 3 3.5
# 1 b 1 7.0
# 4 b 4 7.0
# 5 c 5 NaN
階層型インデックスを持つデータフレームの場合
対象となるデータフレームが階層型インデックスを持つ場合は、やや複雑となる。
import pandas as pd
import numpy as np
df_left2 = pd.DataFrame({'key1': ['Tokyo', 'Tokyo', 'Tokyo', 'Osaka', 'Osaka'],
'key2': [1, 2, 3, 1, 2],
'data': np.arange(5.)})
# key1 key2 data
# 0 Tokyo 1 0.0
# 1 Tokyo 2 1.0
# 2 Tokyo 3 2.0
# 3 Osaka 1 3.0
# 4 Osaka 2 4.0
df_right2 = pd.DataFrame(np.arange(12).reshape((6, 2)),
index=[['Osaka', 'Osaka', 'Tokyo', 'Tokyo', 'Tokyo', 'Tokyo'],
[2, 1, 1, 1, 2, 3]],
columns=['col1', 'col2'])
# col1 col2
# Osaka 2 0 1
# 1 2 3
# Tokyo 1 4 5
# 1 6 7
# 2 8 9
# 3 10 11
上記のように片方のデータフレームが階層型インデックスを持っている場合、マージに用いる複数の列をリストとして指定する必要がある。
df_merge2 = pd.merge(df_left2, df_right2, left_on=['key1', 'key2'], right_index=True)
# key1 key2 data col1 col2
# 0 Tokyo 1 0.0 4 5
# 0 Tokyo 1 0.0 6 7
# 1 Tokyo 2 1.0 8 9
# 2 Tokyo 3 2.0 10 11
# 3 Osaka 1 3.0 2 3
# 4 Osaka 2 4.0 0 1
joinメソッドによるマージ
joinメソッドを使えば、インデックスによるマージをより簡単におこなうことができる。
import pandas as pd
import numpy as np
df_left3 = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]],
index=['a', 'c', 'e'],
columns=['Tokyo', 'Osaka'])
# Tokyo Osaka
# a 1.0 2.0
# c 3.0 4.0
# e 5.0 6.0
df_right3 = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [13., 14.]],
index=['b', 'c', 'd', 'e'],
columns=['Nagoya', 'Fukuoka'])
# Nagoya Fukuoka
# b 7.0 8.0
# c 9.0 10.0
# d 11.0 12.0
# e 13.0 14.0
df_left3.join(df_right3, how='outer')
# Tokyo Osaka Nagoya Fukuoka
# a 1.0 2.0 NaN NaN
# b NaN NaN 7.0 8.0
# c 3.0 4.0 9.0 10.0
# d NaN NaN 11.0 12.0
# e 5.0 6.0 13.0 14.0
ただし、joinメソッドを使う場合は、重複した列名があるといけないので注意が必要だ。