【Python】Pandasのmergeとconcat
Pandas の pd.merge と pd.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