前回の記事で、複数のデータフレームをマージする方法を紹介した。
マージの際にキーとなる列がデータフレームの列内に含まれていれば、前回紹介した方法で問題ないが、今回はインデックスをキーとして利用する場合の例を紹介する。
コンテンツ
サンプルデータフレームの用意
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メソッドを使う場合は、重複した列名があるといけないので注意が必要だ。