最終更新日:2021/8/22
dfどうしの結合、連結の方法を説明します。ここでは、特に横方向(列方向)への結合、連結を扱います。
このページでは、「結合」と「連結」はほぼ同じ意味で用いています。
幾つか方法がありますが、それぞれの特徴に焦点をあて、詳しくは他のHPに譲ります。
【説明すること】
- 1. カラム名(列名)で結合
pd.merge(Left, Right, left_on=['clmR0','clmR1'], right_on=['clmL0','clmL1'], how='inner')
- 2. indexで結合
- 2.1 pd.concat()を使う :
pd.concat([Left, Right], axis=1)
- 2.2 pd.merge()を使う :
pd.merge(Left, Right, left_index= True, right_index= True)
- 2.3 .join()を使う :
df_Left.join(df_Right)
- 2.1 pd.concat()を使う :
- 参考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