18. Pandasでデータ分析

Pandas DataFrameの結合(Join: 内部結合、外部結合)

更新日:

前の章では、複数のDataFrameの結合の方法として、Unionを見ていきました。今度は、もう1つの結合方法であるJoinを確認しましょう。
 
Unionについて知りたい場合は、こちらのリンクより遷移ください。

 

DataFrameにおけるJoin(内部結合、外部結合)とは

Joinとは、2つのDataFrameを結合するキー(結合キー)となる列を元に、DataFrameを繋ぎ合わせる方法です。
 
結合キー以外の列については、2つのDataFrameで異なっていても問題ありません。
 
Joinには大きく分けて2つの種類があり、外部結合は3つに分けることができます。

  • 内部結合(Inner join)
  • 外部結合(Outer join)
    • 左外部結合(Left outer join)
    • 右外部結合(Right outer join)
    • 完全外部結合(Full outer join)

 
 

DataFrameにおける内部結合(Inner join)とは

内部結合とは、2つのDataFrameについて、両方のDataFrameに存在するある項目を結合キーとしてDataFrameを結合させる際に、その項目の値が両方のDataFrameで一致する行のみを抽出する結合方法です。
 
例えば、次のような2つのDataFrame、売上情報ヘッダ(df_sales_header)と顧客マスタ(df_customer)にそれぞれ顧客ID(Customer_ID)がある場合、顧客ID(Customer_ID)を元に2つのDataFrameを結合させる時に使います。
 
結合させることで、売上情報ヘッダ(df_sales_header)に顧客マスタ(df_customer)の顧客名(Customer_Name)を追加することができます。

 
内部結合(Inner join)における各DataFrameの項目の流れを、もう少し詳しく見ていきましょう。
 
df_sales_headerとdf_customerを結合キーCustomer_IDで内部結合させる場合、Customer_IDが2つのDataFrameで一致するC04、C06、C01の行のみが抽出されます。結合後のDataFrameにはそれぞれ元のDataFrameの項目が持ち込まれます。
 
つまりdf_saales_headerからはSales_No、Sales_Dateが、df_customerからはCustomer_Nameの値が新しいDataFrameに追加されます。
 
それでは、先ほどの例を実際にコーディングしていきます。まずは、df_sales_header、df_customerのデータを作成します。
 
最初に、売上情報ヘッダが格納されているCSVファイル「T_Sales_Header2」からデータを読み込みdf_sales_headerに格納します。(※CSVファイルは上のリンクから取得してください。)

In [1]: import pandas as pd
...: df_sales_header = pd.read_csv("T_Sales_Header2.csv")
...: df_sales_header
Out[1]:

 
次に顧客マスタが格納されているCSVファイル「M_Customer2」からデータを読み込みdf_customerに格納します。(※CSVファイルは上のリンクから取得してください。)
 
その際に日本語の名称が文字化けしないようにread_csvの引数encodingに"SHIFT-JIS"を渡します。

In [2]: df_customer = pd.read_csv("M_Customer2.csv",
...:                                          encoding = "SHIFT-JIS")
...: df_customer
Out[2]:

 
 

mergeでのDataFrameの内部結合/外部結合

先ほど準備した2つのDataFrame df_sales_header、df_customerをjoinで結合していきます。
 
DataFrameのJoinの結合には、mergeを使います。2つのDataFrameをそれぞれ、df1、df2とすると、以下のように記述します。

pd.merge(df1, df2, how = inner/left/right/outer, on = ”結合キー”)

引数howでは、結合の方法を指定します。

結合方法howの指定
内部結合(Inner join)inner
左外部結合(Left outer join)left
右外部結合(Right outer join)right
完全外部結合(Full outer join)outer

 
引数onでは、結合するキーを指定します。結合キーが1つの場合、on = “結合キー” と指定し、2つ以上の場合、on = [“結合キー1”, “結合キー2”, …] というようにlistで指定します。ここではon = “Customer_ID” になります。
 
例として、df_sales_headerとdf_customerを内部結合してみましょう。

In [3]: pd.merge(df_sales_header, df_customer,
...:                       how="inner", on = "Customer_ID")
Out[3]:

 
 

DataFrameにおける外部結合(Outer join)とは

外部結合とは、2つのDataFrameについて、両方のDataFrameに存在するある項目を結合キーとしてDataFrameを結合させる際に、基準となるDataFrameは全ての行を出力し、もう一方のDataFrameについては、その項目の値が両方のDataFrameで一致する行のみを抽出する結合方法です。
 
基準となるDataFrameは全ての行を出力するという点が内部結合との違いになります。
 
外部結合は、その基準となるDataFrameの違いにより、以下の3つに分けられます。

  1. 左外部結合(Left outer join): 基準となるDataFrameが左側のDataFrameになります。つまり、左側のDataFrameは全ての行が出力され、右側のDataFrameは結合キーの値が両方のDataFrameで一致する行のみが抽出されます。
  2.  

  3. 右外部結合(Right outer join): 基準となるDataFrameが右側のDataFrameになり、右側のDataFrameは全ての行が出力され、左側のDataFrameは結合キーの値が両方のDataFrameで一致する行のみが抽出されます。
  4.  

  5. 完全外部結合(Full outer join): 基準となるDataFrameが両方のDataFrameになり、結合キーの値が一致する/一致しないにかかわらず、両方のDataFrameの全ての行が出力されます。

 
先ほどと同様、2つのDataFrame、df_sales_headerとdf_customerの例で違いを確認していきましょう。

1. 左外部結合(Left outer join)


黄色で囲った所が前回の内部結合との違いになります。
 
df_sales_headerとdf_customerを結合キーCustomer_IDで左外部結合させた場合、Customer_IDにかかわらず、左側のdf_sales_headerの行は全て出力されます。
 
ここでは結合キーが一致していないCustomer_IDがC03の行も表示されています。
 
df_customerにはCustomer_IDがC03の行は存在していないので、結合後のCustomer_Nameは欠損値を示すNaN(Not a number)と表示されています。
 

2. 右外部結合(Right outer join)


こちらも黄色で囲った所が内部結合との違いになります。df_sales_headerとdf_customerを結合キーCustomer_IDで右外部結合させた場合、Customer_IDにかかわらず、右側のdf_customerの行は全て出力されます。
 
ここでは結合キーが一致していないCustomer_IDがC02、C05の行も表示されています。
 
df_sales_headerにはCustomer_IDがC02、C05の行は存在していないので、結合後のCustomer_No、Sales_Dateは欠損値を示すNaN(Not a number)と表示されています。
 

3. 完全外部結合(Full outer join)


同様に黄色で囲った所が内部結合との違いになります。
 
df_sales_headerとdf_customerを結合キーCustomer_IDで完全外部結合させた場合、Customer_IDにかかわらず、両方のDataFrameの行は全て出力されます。
 
ここでは結合キーが一致していないCustomer_IDがC03、C02、C05の行も表示されています。
 
結合キーがそれぞれのDataFrameに存在しない行の項目の値は、欠損値を示すNaN(Not a number)と表示されています。
 

例)外部結合の記述

それでは外部結合の記述方法を見ていきましょう。
 
最初は左外部結合からです。df_sales_headerとdf_customerを左外部結合します。引数howに対して”left”を渡します。

In [4]: pd.merge(df_sales_header, df_customer,
...:                               how="left", on = "Customer_ID")
Out[4]:

 
次はdf_sales_headerとdf_customerを右外部結合します。引数howに対して”right”を渡します。

In [5]: pd.merge(df_sales_header, df_customer,
...:                              how="right", on = "Customer_ID")
...: df_customer
Out[5]:

 
最後はdf_sales_headerとdf_customerを完全外部結合します。引数howに対して”outer”を渡します。

In [6]: pd.merge(df_sales_header, df_customer,
...:                             how="outer", on = "Customer_ID")
...: df_customer
Out[6]:

 

-18. Pandasでデータ分析

Copyright© AI-interのPython3入門 , 2019 All Rights Reserved.