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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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を設定する。

1
2
3
4
5
6
7
8
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

階層型インデックスを持つデータフレームの場合

対象となるデータフレームが階層型インデックスを持つ場合は、やや複雑となる。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

上記のように片方のデータフレームが階層型インデックスを持っている場合、マージに用いる複数の列をリストとして指定する必要がある。

1
2
3
4
5
6
7
8
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メソッドを使えば、インデックスによるマージをより簡単におこなうことができる。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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メソッドを使う場合は、重複した列名があるといけないので注意が必要だ。