DataFrameを横方向に結合する concat、merge、join-python

SQL の join のように DataFrame を横方向につなげる場合、使用可能な関数(or メソッド)は3つあります。

  • concat
  • merge
  • join

どれを使うかは結合キーをなににするかで変わります。データをキーにして結合したければ merge を使います。インデックスで結合したければ、動きは微妙に違いますが3つのうちどれでも使えます。
ちなみに、concat は縦方向の結合もできます。(ここでは触れませんが)

目次
インデックスで結合
データで結合
インデックス と データで結合
キー不一致(内部・外部結合)
列名が重複する場合

スポンサーリンク

インデックスで結合

インデックスによる結合を、concat、merge、join で実行してみます。

テストデータ

インデックスの AA、BB、CC が結合キーになります。

concat

merge

join

3つとも同じ結果になりました。

データで結合

データ列で結合する場合は merge を使います。

テストデータ

merge

結合キーは left_on、right_on で指定します。

  • 左右の結合キーの名称が同じ場合は on で指定できます。
    pd.merge(df1, df2, on='KEY')
  • 結合キーを指定しなくても、同一名称の列があれば python がキーに割り当ててくれます。
    pd.merge(df1, df2)

インデックス と データで結合

インデックス と データ列で結合する場合も merge を使います。

テストデータ

df1 のインデックス × df2 の KEY 列で結合します。

merge

キー不一致(内部・外部結合)

キーが一致しないケースではどのように結合されるでしょうか。SQL なら内部結合、外部結合で処理しますが、DataFrame でも同じことができるのでしょうか。

結論から言うとできます。内部結合も外部結合(左も右も)も可能です。
サンプルが長くなりますが、concat、merge、join それぞれのケースを確認してみます。

テストデータ

一致するキーは AA だけです。

concat

merge

結合条件は how で指定します。

join

列名が重複する場合

列名が重複すると concat、merge、join で動作がそれぞれ異なります。

テストデータ

concat

列名が重複したままくっつきました。

ignore_index=True を指定すると、列名が 0、1・・・と振りなおされます。
keys オプションを使って列を階層化することもできます。
 ➡ pd.concat([df1, df4], axis=1, keys=['L','R'])

merge

列名に接尾辞 _x、_y がついて区別されました

接尾辞は suffixes オプションで変更できます。たとえば、suffixes=['_1','_2'] と指定すると、列名は aa_1 bb_1 cc aa_2 bb_2 となります。

join

列名が重複するとエラーになります

スポンサーリンク
その他の記事

コメントはお気軽に