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