mergeで結合する
このレッスンでできるようになること。merge を使って売上明細と商品マスタをつなぎ、明細に定価の情報を持ち込めるようになります。SQL の JOIN と同じ操作です。
前回、明細には定価が無く、商品マスタにあることを確かめました。この2つの表を鍵でつなぐのが merge です。
Python
merged = sales.merge(products, on="商品名")SQL で書くとこうなります。
SQL クエリ
SELECT * FROM sales INNER JOIN products ON sales.商品名 = products.商品名;対応は素直です。sales.merge(products) が FROM sales JOIN products、on="商品名" が ON 以下の条件です。既定の結合方法は inner なので、この1行は INNER JOIN そのものです。SQL で JOIN が書ける方なら、覚えることは引数の名前だけです。
注意点を3つ挙げます。1つめは、on に渡す列名は両方の表に同じ名前で存在している必要があるということです。片方が商品名、もう片方が 品名 なら、left_on と right_on で別々に指定します。実務では列名が揃っていないほうが普通なので、この形も覚えておくと困りません。
2つめは、鍵以外に同じ名前の列があると、結合後に _x と _y という接尾辞が付くことです。マイショップの明細とマスタは、どちらも カテゴリ という列を持っています。商品名だけで結合すると、結合後は カテゴリ_x と カテゴリ_y になります。どちらがどちらか分からなくなるので、両方の意味が同じなら on=["商品名", "カテゴリ"] のように鍵を2つにして揃えてしまうのが素直です。
3つめが最も重要です。inner の結合では、マスタに無い商品名を持つ行は結果から消えます。前回見つけた載っていない商品がそれにあたります。行が減ったことに気づかないまま集計すると、総売上が実際より小さく出ます。結合の前後で行数を必ず比べてください。減っているなら、それが意図した結果かどうかを判断する必要があります。この判断を道具にするのが次のレッスンです。
要件
- merge に on=["商品名", "カテゴリ"] を渡して結合する
- 結合前後の行数の差から dropped を求める
- 商品名ごとの売上合計は groupby で求める
- 数値はすべて int に直して返す
入出力例
join_products("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-09,横浜店,白磁のマグカップ,食器,4,7200
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
2026-01-07,大宮店,藍染めのふきん,雑貨,3,1800
", "商品名,カテゴリ,定価
白磁のマグカップ,食器,1800
鉄のフライパン,調理器具,7800
") → {"by_product":{"白磁のマグカップ":10800,"鉄のフライパン":7800},"dropped":1,"rows":3}
join_products("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-04,大宮店,積み重ね収納ボックス,収納,3,4500
", "商品名,カテゴリ,定価
鋳物ホーロー鍋,調理器具,16800
積み重ね収納ボックス,収納,1500
") → {"by_product":{"積み重ね収納ボックス":4500,"鋳物ホーロー鍋":16800},"dropped":0,"rows":2}