【解説】内部結合の方法を学ぶ | データサイエンス100本ノック【問36〜問37 回答】
当ページのリンクには広告が含まれています。
目次
この記事の対象者
・ Pythonで内部結合の設定方法を学びたい人
以降はデータサイエンス100本ノックの問題を題材に、内部結合の方法について学んでいきます。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
第36問目: 内部結合(共通カラムが1つ)
P-036: レシート明細データフレーム(df_receipt)と店舗データフレーム(df_store)を内部結合し、レシート明細データフレームの全項目と店舗データフレームの店舗名(store_name)を10件表示させよ。
表の「結合」といえばconcat
を使えば良いのかな?
結論としては、concat
ではなくmerge
を使います。
concatは、シンプルに2つの表を横方向または縦方向に連結させる関数です。
この問題は、「内部結合」という結合方式であり、concat
のようなシンプルな連結ではありません。
内部結合とは、2つのデータフレームに共通するカラムが存在した場合、そのカラムの値を軸に結合する方式です。こういった結合を行う場合は、merge
という関数を使います。
実際に問題を解きながらmerge
の使い方を学んでいきましょう。
まずは、問題で述べられているdf_receipt
というデータフレームと、df_store
というデータフレームを出力し、共通するカラムの存在を確認しましょう。
まずは、df_receipt
から出力します。
1 | df_receipt |
1 | sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount |
次に、df_store
を出力します。カラム名だけ把握できれば良いので、head()
を付与します。
1 | df_store.head() |
1 |
|
共通のカラムは、store_cd
が目視で確認できます。
共通のカラムは、目視で確認しないといけないの?カラムがたくさん存在したら確認するの大変だよね?
共通のカラムを機械的に抽出する方法もあります。その方法については本記事の後半でまとめたいと思います。
共通のカラムがstore_cd
であることが分かったので、早速merge
関数を用いて内部結合していきます。
回答であるコードを先に記述した上で、merge
関数の使い方を解説します。
1 | pd.merge(df_receipt, df_store[['store_cd', 'store_name']], how='inner', on='store_cd').head(10) |
merge関数の第1引数と第2引数は、結合するデータフレームを指定します。
問題文よりdf_receipt
に対してdf_store
を内部結合しdf_receipt
の全項目とdf_store
の店舗名(store_name
)を10件表示させたいので、第2引数には、df_store
から共通カラムであるstore_cd
とstore_name
のみを抽出したデータフレームを結合する対象として指定します。
第3引数のhow
は、結合方法を指定します。
how
で指定できる結合方法は以下のとおりです。
inner
: 内部結合left
: 左結合right
: 右結合outer
: 完全外部結合
今回は内部結合なので、how='inner'
とします。
第4引数のon
は、共通するカラム名を指定します。
結合する2つのデータフレームに共通するカラムは、store_cd
なので、on='store_cd'
とします。
回答のコードを実行すると以下のような出力が得られ、正常に内部結合がされていることが確認できます。
1 | sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount store_name |
第37問目: 内部結合(共通カラムが複数)
P-037: 商品データフレーム(df_product)とカテゴリデータフレーム(df_category)を内部結合し、商品データフレームの全項目とカテゴリデータフレームの小区分名(category_small_name)を10件表示させよ。
この問題もmerge
関数を用いて2つのデータフレームを内部結合します。
内部結合をするために、まずは2つのデータフレームにおいて共通する絡むを把握します。
2つのデータフレームそれぞれを出力します。
まずは、df_product
です。
1 | df_product |
1 |
|
続いて、df_category
です。
1 | df_category |
1 | category_major_cd category_major_name category_medium_cd category_medium_name category_small_cd category_small_name |
さて、共通するカラムは何でしょうか?
目視で共通するカラムを抽出するのは少し厳しいですよね。
ここからは共通するカラムをpythonを使って抽出する方法をまとめたいと思います。
2つのデータフレームにおける共通カラムの抽出方法
大まかな流れは以下です。
2. 各カラムデータの重複値のみを抽出して出力する
1. 各データフレームのカラムデータのみを抽出
まずは、各データフレームのカラムデータのみを抽出します。
データフレームのカラムデータの抽出は、columns
メソッドを使うことで簡単に抽出できます。
まずはdf_product
からカラムデータを抽出し、df_product_columns
という変数に代入します。
1 | df_product_columns = df_product.columns |
1 | Index(['product_cd', 'category_major_cd', 'category_medium_cd', |
では、もう一方のデータフレームであるdf_category
についても同様に、カラムデータを抽出し、df_category_columns
という変数に代入します。
1 | df_category_columns = df_category.columns |
1 | Index(['category_major_cd', 'category_major_name', 'category_medium_cd', |
これで各データフレームのカラムデータのみの抽出が完了しました。
2. 各カラムデータの重複値のみを抽出して出力する
各カラムデータは配列として抽出されています。
2つの配列データから共通のデータを抽出するにはset
を使います。
1 | df_and = set(df_product_columns) & set(df_category_columns) |
1 | {'category_major_cd', 'category_medium_cd', 'category_small_cd'} |
各カラムデータの重複値が出力されました。
つまり、本問題で内部結合をする上で考慮が必要な共通するカラムデータは、category_major_cd
, category_medium_cd
, category_small_cd
の3つであることが分かりました。
早速mergeメソッドを用いて、df_product
に対して、df_category
の共通カラム3つとcategory_small_cd
を抽出したデータフレームを内部結合します。
1 | pd.merge(df_product |
1 | product_cd category_major_cd category_medium_cd category_small_cd unit_price unit_cost category_small_name |
これで完了です。
まとめ: 内部結合の方法を学びました。
本記事は、【Python】内部結合の方法を学ぶ | データサイエンス100本ノック【問36〜問37 回答】というテーマでまとめました。
内部結合のポイントは、共通カラムを把握することです。
本記事では共通カラムを抽出する方法も合わせて紹介しました。