最終更新日:2021/8/22

dfどうしの結合、連結の方法を説明します。ここでは、特に横方向(列方向)への結合、連結を扱います。
このページでは、「結合」と「連結」はほぼ同じ意味で用いています。
幾つか方法がありますが、それぞれの特徴に焦点をあて、詳しくは他のHPに譲ります。

【説明すること】

1. カラム名(列名)で結合

pd.merge(Left, Right, on='key', how='left')を使います。

Microsoft Accessで言うとクエリ―でテーブル同志を結合するのと同じです。SQL文で言うと、「JOIN A ON B」です。
結合の為のキー(key)を持ったテーブル同志を、そのキー(key)で突合して結合します。

1.1 カラム名を1列だけ指定する場合

keyを1つの列で指定する場合です。カラム名が同じ場合と、異なる場合、それぞれを見ていきましょう。

(1a)カラム名が同じ場合

LeftとRightで、結合するkeyが同じカラム名の場合は、pd.merge()を使って以下のように書きます。

pd.merge(Left, Right, on='key', how='left')

Leftは左のdf, Rightは右のdfです。

on=で結合するkeyとなるdfのカラム名(列名)を指定します。
how=のデフォルトはhow='left'なので、この場合は省略可能です。

how=で指定する、結合の方法は以下の通りです。

inner : 内部結合。両方に含むものだけ。
left : 左外部結合。左においたものを全て残す。デフォルト。省略可。
right : 右外部結合。右においたものを全て残す。
outer : 完全外部結合。左右、全てを残す。

(1b)カラム名が違う場合

LeftとRightでカラム名が違う場合は、left_on=right_on=にそれぞれのカラム名を指定して、以下のように書きます。
pd.merge(left, right, left_on='lkey', right_on='rkey',  how='left')

以下のcsvファイルを読み込んで例を挙げます。
a004_009a_left.csv, a004_009_right.csv


この場合、keyとしたleftとrightの列が両方残るので、不要な場合(どちらかあれば十分という場合)は.drop()を使えば、削除できます。

1.2 カラム名を複数列指定する場合

on=にlistでカラム名を指定します。
例えば、left_on=['L1', 'L2'], right_on=['R1', 'R2']と書くと、’L1’と’R1’が同じもの、かつ、’L2’と’R2’が同じもの、という意味です。

keyがユニーク(一意)でなかったらどうなる?

keyがユニーク(一意)でない場合、どうなるのでしょうか?
同じ名前がkeyの中で重複している場合です。この場合、Pythonは自動で、必要なデータを作成してくれます。多くの場合、欲しいデータを作成してくれますが、意図した結果か、必ず確認する必要があります。
以下のcsvファイルを使って、1つだけ例を挙げます。

a004_009b_left.csv, a004_009b_right.csv

2. indexで結合

2.1 pd.concat()を使う

indexをキーとした結合で、

pd.concat([Left, Right], axis=1)

と書きます。

Leftは左のdf、Rightは右のdfです。

axis=1はよく使うオプションで、一般に「横方向へ(列方向へ)」という意味です。
他にaxis=0もあり、これは「縦方向へ(行方向へ)」という意味です。
ここでは横方向を扱うので、axis=1だけを使います。

pd.concat()には、次の特徴があるので、単純にLeftとRightを横にくっつけたい場合にも有効です。

(1) LeftとRightのカラム名が重複しても、元のカラム名が残る
(2) 見た目が、そのままの形で横に結合される

ですが、indexを意識しないとうまくいかないので、例を見ながら特徴を捉えてください。

ポイントは、「Left、 Rightを[]でくくって書く」こと、「axis=1を指定する」ことです。

以下のcsvファイルを読み込みます。
a004_009c_left.csv, a004_009c_right.csv, a004_009c_rr.csv

2.2 pd.merge()を使う

indexの場合も、カラム名と同様に、pd.merge()を使って、結合が可能です。
但し、オプションでleft_index= True, right_index= Trueを指定します。

2.3 df_L.join().df_Rを使う

indexであれば、.join()を使って、
df_Left.join(df_Right)

でも可能です。df_Leftは左のdf, df_Rightは右のdfです。
オプションのhow=.merge()と同じものが指定可能です。how='left'はデフォルトなので、この場合は省略可能です。

但し、leftとrightで、同じカラム名があると、エラーとなります。

そういう意味では、.concat().merge()は自動でカラム名を変更してくれるので、そちらの方が扱いやすいでしょう。

参考HP

以下のHPがとても詳しいので、参考にしてください。図があって、とても分かりやすいです。
https://sinhrks.hatenablog.com/entry/2015/01/28/073327