18. Pandasでデータ分析

図解!Pandas DataFrameのmergeによる結合(JOIN)

更新日:

データを分析する上では、通常は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を徹底解説!」を参照ください。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

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つずつ詳しく確認していきます。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

mergeの使い方(引数howによる結合方法・onによる結合キー(単一・複数)の指定方法)

Pandasにおいて、DataFrameのJOIN(内部結合・外部結合)にはmerge()を使います。2つのDataFrameをそれぞれ、df1、df2とすると、以下のように記述します。

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

 
引数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)/配列の使い方」を参照ください。

 
 

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に追加されます。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

mergeでの内部結合(INNER JOIN)

それでは、先ほど出てきました下記の例を元に、実際にコーディングしながらmergeを用いてDataFrameを内部結合(INNER JOIN)する方法を確認していきます。
 

 
 
まずは、df_sales_header、df_customerのデータを作成します。
 
最初に、売上情報ヘッダが格納されているCSVファイル「T_Sales_Header2」からデータを読み込みdf_sales_headerに格納します。(※CSVファイルは上のリンクから取得してください。)

またCSVファイルの読み込みに関する詳しい説明は、「Pandas Excel、CSVファイルの読み込み、書き込み(出力)」を参照ください。

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

 
 
こうして作成した2つのDataFrame df_sales_header、df_customerを内部結合していきます。merge()の引数として、2つのDataFrame、howには"inner"(内部結合)、onには結合キーとなる"Customer_ID"を渡します。

想定された結果どおり、Customer_IDが2つのDataFrameで一致するC04、C06、C01の行のみが抽出されました。
 
またdf_saales_headerからはSales_No、Sales_Dateが、df_customerからはCustomer_Nameの列の値が、新しいDataFrameに追加されています。

 
 

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)と表示されています。

 
 

mergeでの外部結合(OUTER JOIN)

それでは先ほど出てきました3つの外部結合の記述方法をそれぞれ見ていきましょう。

 
 

mergeでの左外部結合(LEFT OUTER JOIN)

最初は左外部結合からです。df_sales_headerとdf_customerを左外部結合します。引数howに対して”left”を渡します。

 
 

mergeでの右外部結合(RIGHT OUTER JOIN)

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

 
 

mergeでの完全外部結合(FULL OUTER JOIN)

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

 
 
関連記事です。
Pandasの中心となるDataFrame(データフレーム)については、次の記事で詳しく解説しております。

 






まとめ記事

1

Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。   Requests、Beautiful Soup、Selenium、Pandas、newspape ...

2

Pythonの基本的なトピックについて、チュートリアル形式で初心者向けに解説した記事です。プログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。   Pythonでデータ ...

3

Pandas(パンダス)とは、データを効率的に扱うために開発されたPythonのライブラリの1つで、データの取り込みや加工・集計、分析処理に利用します。   Pandasには2つの主要なデー ...

4

データ分析、機械学習、ディープラーニングにはグラフの描画による可視化は不可欠です。データは、加工前の状態ではただの数字の羅列でしかなく、一目で必要な情報が伝わるものではありません。それを集計しグラフに ...

5

NumPy(ナンパイ)は、数値計算を効率的に行うための拡張ライブラリです。ベクトルや行列などを効率的に数値計算するための数学関数ライブラリを提供します。NumPyを使うことにより、数値計算をより早く、 ...

-18. Pandasでデータ分析

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