データを分析する上では、通常は1つのDataFrameだけではなく、複数のDataFrameを組み合わせて、データを確認・分析していく必要があります。その際に必要となるのが、結合の処理です。
DataFrameの結合方法を、データベースにおけるSQLでのテーブルの結合方法に例えると、結合には行単位の連結であるUNION(ユニオン)と、列単位の連結であるJOIN(ジョイン)の2種類があり、それぞれ次のようなものになります。
- 行単位の連結(UNION):同じ列をもつDataFrameを縦(行を増やす)方向に連結する。
- 列単位の連結(JOIN):結合するキーとなる列を元に、DataFrameを横(列を増やす)方向に連結する。
この記事では、DataFrameの結合方法の1つである列単位の結合(JOIN)について学んでいきましょう。Pandasではmerge()を利用して、DataFrameに対して様々な結合(JOIN)を実現することができます。
行単位の連結(UNION)の詳しい説明は、「図解!Pandas DataFrameの結合(UNION)」を参照ください。
またPandasのもう1つのデータ構造であるSeriesの結合方法については、「Pandas Seriesを徹底解説!」を参照ください。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
DataFrameにおけるJOIN(内部結合、外部結合)とは
JOINとは、2つのDataFrameを結合するキー(結合キー)となる列を元に、DataFrameを繋ぎ合わせる方法です。結合キー以外の列については、2つのDataFrameで異なっていても問題ありません。
JOINには大きく分けて内部結合と外部結合の2つの種類があり、外部結合はさらに3つに分けることができます。
- 内部結合(INNER JOIN)
- 外部結合(OUTER JOIN)
- 左外部結合(LEFT OUTER JOIN)
- 右外部結合(RIGHT OUTER JOIN)
- 完全外部結合(FULL OUTER JOIN)
それぞれの結合方法については、後の章で1つずつ詳しく確認していきます。
mergeの使い方(引数howによる結合方法・onによる結合キー(単一・複数)の指定方法)
Pandasにおいて、DataFrameのJOIN(内部結合・外部結合)にはmerge()を使います。2つのDataFrameをそれぞれ、df1、df2とすると、以下のように記述します。
引数howでは、結合の方法を指定します。結合方法と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)/配列の使い方」を参照ください。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
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に追加されます。
mergeでの内部結合(INNER JOIN)
それでは、先ほど出てきました下記の例を元に、実際にコーディングしながらmergeを用いてDataFrameを内部結合(INNER JOIN)する方法を確認していきます。
まずは、df_sales_header、df_customerのデータを作成します。
最初に、売上情報ヘッダが格納されているCSVファイル「T_Sales_Header2」からデータを読み込みdf_sales_headerに格納します。(※CSVファイルは上のリンクから取得してください。)
1 2 3 | import pandas as pd df_sales_header = pd.read_csv("T_Sales_Header2.csv") df_sales_header |
またCSVファイルの読み込みに関する詳しい説明は、「Pandas Excel、CSVファイルの読み込み、書き込み(出力)」を参照ください。
次に顧客マスタが格納されているCSVファイル「M_Customer2」からデータを読み込みdf_customerに格納します。(※CSVファイルは上のリンクから取得してください。)その際に日本語の名称が文字化けしないようにread_csvの引数encodingに"SHIFT-JIS"を渡します。
1 2 3 | df_customer = pd.read_csv("M_Customer2.csv", encoding = "SHIFT-JIS") df_customer |
こうして作成した2つのDataFrame df_sales_header、df_customerを内部結合していきます。merge()の引数として、2つのDataFrame、howには"inner"(内部結合)、onには結合キーとなる"Customer_ID"を渡します。
1 2 | pd.merge(df_sales_header, df_customer, how="inner", on = "Customer_ID") |
想定された結果どおり、Customer_IDが2つのDataFrameで一致するC04、C06、C01の行のみが抽出されました。
またdf_saales_headerからはSales_No、Sales_Dateが、df_customerからはCustomer_Nameの列の値が、新しいDataFrameに追加されています。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
DataFrameにおける外部結合(OUTER JOIN)とは
外部結合とは、2つのDataFrameについて、両方のDataFrameに存在するある項目を結合キーとしてDataFrameを結合させる際に、基準となるDataFrameは全ての行を出力し、もう一方のDataFrameについては、その項目の値が両方のDataFrameで一致する行のみを抽出する結合方法です。
基準となるDataFrameは全ての行を出力するという点が内部結合との違いになります。
外部結合は、その基準となるDataFrameの違いにより、以下の3つに分けられます。
- 左外部結合(LEFT OUTER JOIN):基準となるDataFrameが左側のDataFrameになります。つまり、左側のDataFrameは全ての行が出力され、右側のDataFrameは結合キーの値が両方のDataFrameで一致する行のみが抽出されます。
- 右外部結合(RIGHT OUTER JOIN):基準となるDataFrameが右側のDataFrameになり、右側のDataFrameは全ての行が出力され、左側のDataFrameは結合キーの値が両方のDataFrameで一致する行のみが抽出されます。
- 完全外部結合(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)と表示されています。
mergeでの外部結合(OUTER JOIN)
それでは先ほど出てきました3つの外部結合の記述方法をそれぞれ見ていきましょう。
mergeでの左外部結合(LEFT OUTER JOIN)
最初は左外部結合からです。df_sales_headerとdf_customerを左外部結合します。引数howに対して”left”を渡します。
1 2 | pd.merge(df_sales_header, df_customer, how="left", on = "Customer_ID") |
mergeでの右外部結合(RIGHT OUTER JOIN)
次はdf_sales_headerとdf_customerを右外部結合します。引数howに対して”right”を渡します。
1 2 | pd.merge(df_sales_header, df_customer, how="right", on = "Customer_ID") |
mergeでの完全外部結合(FULL OUTER JOIN)
最後はdf_sales_headerとdf_customerを完全外部結合します。引数howに対して”outer”を渡します。
1 2 | pd.merge(df_sales_header, df_customer, how="outer", on = "Customer_ID") |
関連記事です。
Pandasの中心となるDataFrame(データフレーム)については、次の記事で詳しく解説しております。