Pandas でデータフレームの結合 (マージ, JOIN)

このページでは、Pandas で作成したデータフレーム同士を結合する方法について紹介します。

2 つのデータフレームを結合する

以下の例では、merge() メソッドを用いて、2 つのデータフレームを作成し、内部結合 (inner join) を行います。

Merge メソッドの使い方

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
      left_index=False, right_index=False, sort=True,
      suffixes=('_x', '_y'), copy=True, indicator=False)

引数

left データフレーム (DataFrame) オブジェクト。
right もう一つのデータフレーム (DataFrame) オブジェクト。
on 結合に用いる行の名前。left と right のデータフレーム両方に存在する必要があります。値が設定されていなく、かつ left_index と right_index も設定されていない場合は、結合に用いるキーを推測により選択します。
left_on left のデータフレームでキーとして用いる列名、または配列。
right_on right のデータフレームでキーとして用いる列名、または配列を選択。
left_index True を設定すると、left のデータフレームの行ラベルを結合のキーとして用います。MultiIndex (階層的なインデックス構造) を持つデータフレームの場合、階層数を left と right で合わせる必要があります。
right_index left_index と同じです。
how ‘left’, ‘right’, ‘outer’, ‘inner’ のいずれかを設定。 (デフォルトは “inner”)
sort True を設定すると、結合後のデータフレームをソートします。(デフォルトは True)
suffixes 同一のカラム名が存在した場合に、後ろに文字列を追加して区別します。 (デフォルトは ‘_x’, ‘_y’)
copy 常に与えられたデータフレームをコピーします。場合によっては、False に設定すると、パフォーマンスやメモリの使用量を向上できる場合があります。 (デフォルトは True)
indicator _merge という名前のカラムを出力後のデータフレームに追加し、結合前の行に関する情報を格納します。
>>> import pandas as pd
>>> import numpy as np

>>> # データフレーム customer (顧客) を作成
>>> customer = pd.DataFrame([["0001", "John"], ["0002", "Lily"]], columns=['customer_id', 'name'])
>>> customer
  customer_id  name
0        0001  John
1        0002  Lily

>>> # データフレーム order (注文) を作成
>>> order = pd.DataFrame([["0001", "Smartphone"],
                          ["0001", "Wireless Charger"],
                          ["0002", "Wearable watch"]],
                          columns=['customer_id', 'product_name'])

>>> order
  customer_id      product_name
0        0001        Smartphone
1        0001  Wireless Charger
2        0002    Wearable watch

>>> # データフレーム customer と order を内部結合
>>> pd.merge(customer, order, how="inner", on="customer_id")
  customer_id  name      product_name
0        0001  John        Smartphone
1        0001  John  Wireless Charger
2        0002  Lily    Wearable watch

結合に用いるキーが異なる場合は、left_on, right_on 引数で指定します。

>>> # データフレーム employee (従業員) を作成
>>> employee = pd.DataFrame([["Miki", "Tokyo"],["Ichiro", "Osaka"]],
                            columns=['employee_name', 'office_name'])
>>> employee
  employee_name office_name
0          Miki       Tokyo
1        Ichiro       Osaka

>>> # データフレーム office (事務所) を作成
>>> office = pd.DataFrame([["Tokyo", "1-2-3 Chiyoda-ku Tokyo"],
                           ["Osaka", "3-2-1 Chuo-ku Osaka"]],
                          columns=['name', 'address'])
>>> office
    name                 address
0  Tokyo  1-2-3 Chiyoda-ku Tokyo
1  Osaka     3-2-1 Chuo-ku Osaka

>>> # データフレーム employee と office を内部結合
>>> pd.merge(employee, office, how="inner", left_on="office_name", right_on="name")
  employee_name office_name   name                 address
0          Miki       Tokyo  Tokyo  1-2-3 Chiyoda-ku Tokyo
1        Ichiro       Osaka  Osaka     3-2-1 Chuo-ku Osaka

外部結合 (Left join, outer join) を行う際は how 引数にてそれぞれ指定します。

>>> # データフレーム products (商品) を作成
>>> products = pd.DataFrame([["P-001", "Orange"],
                             ["P-002", "Apple"],
                             ["P-003", "Blueberry"]],
                            columns=['product_id', 'name'])
>>> products
  product_id       name
0      P-001     Orange
1      P-002      Apple
2      P-003  Blueberry

>>> # データフレーム stock (在庫) を作成
>>> stock = pd.DataFrame([["P-001", 10],
                          ["P-002", 20],
                          ["P-010", 30]],
                         columns=['product_id', 'amount'])
>>> stock
  product_id  amount
0      P-001      10
1      P-002      20
2      P-010      30

>>> # Left Join (Left outer join, 左部分外部結合)
>>> pd.merge(products, stock, how="left", on="product_id")
  product_id       name  amount
0      P-001     Orange      10
1      P-002      Apple      20
2      P-003  Blueberry     NaN

>>> # Right Join (Left outer join, 右部分外部結合)
>>> pd.merge(products, stock, how="right", on="product_id")
  product_id    name  amount
0      P-001  Orange      10
1      P-002   Apple      20
2      P-010     NaN      30

>>> # Outer join (Full outer join, 完全外部結合)
>>> pd.merge(products, stock, how="outer", on="product_id")
  product_id       name  amount
0      P-001     Orange      10
1      P-002      Apple      20
2      P-003  Blueberry     NaN
3      P-010        NaN      30

2 つのデータフレームを結合する (concat)

2 つのデータフレームを縦方向に結合するには、pd.concat メソッドを用いて行えます。

>>> df1 = pd.DataFrame([["0001", "John"],
                        ["0002", "Lily"]],
                       columns=['id', 'name'])
>>> df1
     id  name
0  0001  John
1  0002  Lily

>>> df2 = pd.DataFrame([["0003", "Chris"],
                        ["0004", "Jessica"]],
                       columns=['id', 'name'])
>>> df2
     id     name
0  0003    Chris
1  0004  Jessica

>>> pd.concat([df1, df2], ignore_index=True)
     id     name
0  0001     John
1  0002     Lily
2  0003    Chris
3  0004  Jessica

参考: Merge, join, and concatenate — pandas 0.18.0 documentation