このページでは、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