ここでは複数のデータフレームの結合演算を行います.これはリレーショナルデータベースの自然結合演算に相当します.
はじめに,モジュールをインポートします.
# モジュールのインポート
import pandas as pd
次に,3つの CSV ファイルを順番に読み込みます.まずは,販売データである machine-sales-sales.csv ファイルを読み込み,df_sales
に格納します.ここで,系列 branch_id
および staff_id
は外部キーになっており,他のデータフレームの主キー(候補キー)を参照していることに注意します.
# CSV ファイルを読み込む
url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-sales.csv?raw=true"
df_sales = pd.read_csv(url, parse_dates=["date"])
df_sales
続いて,支店一覧 machine-sales-branch.csv ファイルを読み込み,df_branch
に格納します.
# CSV ファイルを読み込む
url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-branch.csv?raw=true"
df_branch = pd.read_csv(url)
df_branch
さらに,営業担当者の一覧 machine-sales-staff.csv ファイルを読み込み,df_staff
に格納します.
# CSV ファイルを読み込む
url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-staff.csv?raw=true"
df_staff = pd.read_csv(url)
df_staff
ここでは,今読み込んだ3つのデータフレームを結合し,次のようなデータフレームを作成してみます.
merge()
関数を利用すると,2つのデータフレームを結合することができます.まず,df_sales
と df_branch
を結合します.このとき,どちらのデータフレームにも branch_id
という系列があるので,これを手がかりに結合してくれます.
pd.merge(df_sales, df_branch)
同じ方法で,df_sales
と df_staff
を結合します.ここでも,staff_id
という系列が両データフレームに存在するので,これを手がかりに結合できます.
pd.merge(df_sales, df_staff)
なお,結合したいデータフレームで系列名が異なる場合はこちらを参照してください.
次は,3つのデータフレームを結合します.上と同じ方法で引数に3つのデータフレームを指定しても,結合することはできません.
pd.merge(df_sales, df_branch, df_staff)
ValueError Traceback (most recent call last)
3つのデータフレームの結合は,まず2つのデータフレーム(df_sales
と df_branch
)を結合し,さらにその結果と3つ目のデータフレーム(df_staff
)を結合することで実現できます.この方法が理解できれば4つ以上でも結合できるはずです.
pd.merge(
pd.merge(df_sales, df_branch),
df_staff
)
上の結果で barnch_id
や staff_id
を表示する必要がないのであれば,必要な系列のみを抽出すると良いでしょう.これを関係データベースの世界では射影演算と呼びます.なお,系列の表示順も変更しています.
pd.merge(
pd.merge(df_sales, df_branch),
df_staff
)[['id', 'date', 'branch', 'name', 'amount']]
上で抽出した結果から新たなデータフレームを作成することももちろん可能です.
df = pd.merge(
pd.merge(df_sales, df_branch),
df_staff
)[['id', 'date', 'branch', 'name', 'amount']]
df
上の結果では,id
列の表示順が変更されてしまっています.id
順にソートしてデータフレームを更新することも可能です.
df = df.sort_values(by=['id'], ascending=[True])
df