前回の記事で、複数のデータフレームをマージする方法を紹介した。

マージの際にキーとなる列がデータフレームの列内に含まれていれば、前回紹介した方法で問題ないが、今回はインデックスをキーとして利用する場合の例を紹介する。

サンプルデータフレームの用意

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メソッドを使う場合は、重複した列名があるといけないので注意が必要だ。