このページでは、Pandas で作成したデータフレーム同士を結合する方法について紹介します。
2 つのデータフレームを結合する
以下の例では、merge()
メソッドを用いて、2 つのデータフレームを作成し、内部結合 (inner join) を行います。
Merge メソッドの使い方
1 2 3 |
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 という名前のカラムを出力後のデータフレームに追加し、結合前の行に関する情報を格納します。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
>>> 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
引数で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
>>> # データフレーム 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
引数にてそれぞれ指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
>>> # データフレーム 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
メソッドを用いて行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
>>> 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