【Python】Pandasのmergeとconcat

Pandas の pd.mergepd.concat の使い方の備忘録。

merge


2つのデータフレームを結合する。横結合(join)に対応。

SQLで使われる内部結合(inner join)、外部結合(outer join)、左結合(left join)、右結合(right join)と同じ機能を一通り扱える。

コード例

pd.merge(df1, df2, how="inner", on="USUBJID")


引数(一部)

引数 内容
how = "inner" で内部結合。
"outer" で外部結合。
"left" で左結合。
"right" で右結合。
on =
left_on =
right_on =
left_index =
right_index =
別表参照。
sort = ソートの有無。Trueでソートする。デフォルトはFalse。
suffixes = 同一列名があった場合、列名末尾に追加する文字を指定。
デフォルトは ('_x' '_y') 。
末尾を_A, _Bとしたければ suffixes = ('_A' '_B') とする。


結合キーの組み合わせ

引数 内容
on = "カラム名" 同名のカラムで結合。
left_on = "カラム名1"
,right_on = "カラム名2"
カラム名をそれぞれ指定して結合。
left_index = True
,right_index = True
インデックス同士で結合。
left_on = "カラム名1"
,right_index = True
左はカラム名、右はインデックスを指定して結合。
left_index = True
,right_on = "カラム名2"
右はカラム名、左はインデックスを指定して結合。


結合方法の組み合わせの例

ADS11 = pd.DataFrame({"ID1":[1,2,3,4,5], "AVAL":[3,5,3,5,6]})
ADS12 = pd.DataFrame({"ID1":[3,4,5,6,7], "ID2":[5,6,7,8,9], "AVAL":[7,8,5,8,7]})
 
#-- ID1で結合。
pd.merge(ADS11, ADS12, how="inner", on="ID1", suffixes=("_11","_12"))
Out[1]: 
   ID1  AVAL_11  ID2  AVAL_12
0    3        3    5        7
1    4        5    6        8
2    5        6    7        5
 
#-- ADS11はID1、ADS12はID2で結合。
pd.merge(ADS11, ADS12, how="inner", left_on="ID1", right_on="ID2")
Out[2]: 
   ID1_x  AVAL_x  ID1_y  ID2  AVAL_y
0      5       6      3    5       7
 
#-- インデックス同士で結合
pd.merge(ADS11, ADS12, how="inner", left_index=True, right_index=True)
Out[36]: 
   ID1_x  AVAL_x  ID1_y  ID2  AVAL_y
0      1       3      3    5       7
1      2       5      4    6       8
2      3       3      5    7       5
3      4       5      6    8       8
4      5       6      7    9       7
 
#-- ADS11はインデックス、ADS12はID1を使って結合
pd.merge(ADS11, ADS12, how="inner", left_index=True, right_on="ID1")
Out[3]: 
   ID1  ID1_x  AVAL_x  ID1_y  ID2  AVAL_y
0    3      4       5      3    5       7
1    4      5       6      4    6       8
 
#-- ADS11はID1、ADS12はインデックスを使って結合
pd.merge(ADS11, ADS12, how="inner", left_on="ID1", right_index=True)
Out[4]: 
   ID1  ID1_x  AVAL_x  ID1_y  ID2  AVAL_y
0    1      1       3      4    6       8
1    2      2       5      5    7       5
2    3      3       3      6    8       8
3    4      4       5      7    9       7


concat


2つ以上のデータフレームを結合する。横結合(join)と縦結合(union)の両機能が扱える。

横結合(join)においては、pd.merge と異なり、3つ以上のデータフレームも一度に扱える特徴を持つ。 一方、結合方式は内部結合(inner join)と外部結合(outer join)の2択になるため、一長一短。使い分けになる。

コード例

pd.concat([df1, df2], axis=0, join="outer", keys=["Group1", "Group2"])
pd.concat([df1, df2, df3], axis=0, join="outer", keys=["Group1", "Group2"])


引数(一部)

引数 内容
axis = 0 で縦結合、1 で横結合。
join = "outer" で全ての列/行を結合。
"inner" で共通する列/行のみ結合。
ignore_index = Trueでインデックスを振りなおす。
デフォルトは False で、結合前のインデックスをそのまま使う。
keys = リスト型でマルチインデックス内のキー名を指定する。
例:["Group1", "Group2"]
※マルチインデックスの設定例を参照。
names = リスト型でインデックス名を指定する。
例:["index1", "index2"]
※マルチインデックスの設定例を参照。
sort = ソートの有無。Trueでソートする。デフォルトはFalse。


結合方法の組み合わせの例

ADS11 = pd.DataFrame({"COL1":[1,3], "AVAL":[3,5]}, index=[1,2])
ADS12 = pd.DataFrame({"COL2":[3,5], "AVAL":[7,8]}, index=[3,2])
 
#-- 縦結合。全ての列を結合。
pd.concat([ADS11, ADS12], axis=0, join="outer")
Out[1]: 
   COL1  AVAL  COL2
1   1.0     3   NaN
2   3.0     5   NaN
3   NaN     7   3.0
2   NaN     8   5.0
 
#-- 縦結合。共通列のみ結合。
pd.concat([ADS11, ADS12], axis=0, join="inner")
Out[2]: 
   AVAL
1     3
2     5
3     7
2     8
 
#-- 横結合。全ての列を結合。
pd.concat([ADS11, ADS12], axis=1, join="outer")
Out[3]: 
   COL1  AVAL  COL2  AVAL
1   1.0   3.0   NaN   NaN
2   3.0   5.0   5.0   8.0
3   NaN   NaN   3.0   7.0
 
#-- 横結合。共通列のみ結合。
pd.concat([ADS11, ADS12], axis=1, join="inner")
Out[4]: 
   COL1  AVAL  COL2  AVAL
2     3     5     5     8


マルチインデックスの設定例

#-- 縦結合
pd.concat([ADS11, ADS12]
            ,axis = 0, join = "outer"
            ,keys = ["Group1", "Group2"]
            ,names = ["Index1","Index2"]
            ,sort   = True
    )
 
Out[1]: 
               AVAL  COL1  COL2
Index1 Index2                  
Group1 1          3   1.0   NaN
       2          5   3.0   NaN
Group2 3          7   NaN   3.0
       2          8   NaN   5.0
 
#-- 横結合
pd.concat([ADS11, ADS12]
            ,axis = 1, join = "outer"
            ,keys = ["Group1", "Group2"]
            ,names = ["Index1","Index2"]
            ,sort   = True
    )
 
Out[2]: 
Index1 Group1      Group2     
Index2   COL1 AVAL   COL2 AVAL
1         1.0  3.0    NaN  NaN
2         3.0  5.0    5.0  8.0
3         NaN  NaN    3.0  7.0
本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。