なぜ結合が要るか
このレッスンでできるようになること。売上明細に商品の情報が足りない理由を説明でき、足りない情報がどこにあるかをコードで確かめられるようになります。
マイショップ・チェーンの売上CSVには、売上日・店舗・商品名・カテゴリ・数量・金額しか入っていません。仕入原価も定価も入っていないので、このままでは利益を計算できません。分析する側からすると不便に見えますが、これは設計としては正しい形です。もし明細の1行ごとに定価を書いていたら、値上げのたびに過去の全明細を書き換えることになります。書き換え漏れがあれば、同じ商品が2つの定価を持つことになります。
だから商品の情報は商品マスタという別の表に1回だけ持ち、明細からは商品名で参照します。1つの事実を1か所にだけ置くこの考え方が正規化です。SQL入門やDB設計で扱った内容と同じで、pandas でも事情は変わりません。
Python
print(sales.columns.tolist())
print(products.columns.tolist())分析の最初にやるべきことは、手元の表にどの列があり、どの列が両方に共通しているかを確かめることです。共通している列が、2つの表をつなぐ鍵になります。今回の題材では商品名がそれにあたります。
もう1つ確かめておきたいのが、明細に出てくる商品名がマスタにすべて載っているかどうかです。載っていない商品名があると、あとで結合したときにその行が消えるか、定価が空になります。廃番になった商品や、表記ゆれが残っていると起こります。3章で表記ゆれを整えたのは、まさにこの場面のためでした。結合の前にこの照合をしておくと、あとで数字が合わない原因を探し回らずに済みます。
今回は結合そのものはまだ行いません。足りない情報が何で、どの鍵でつながるのかを、コードで確かめるところまでを扱います。次のレッスンで実際につなぎます。
要件
- 共通する列は両方の columns から求める
- 明細にあってマスタに無い商品名を探す
- リストはどちらも昇順に並べ、同じ商品名は1つにまとめる
- 行数は int で返す
入出力例
inspect_tables("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
2026-01-07,大宮店,藍染めのふきん,雑貨,3,1800
", "商品名,カテゴリ,定価
白磁のマグカップ,食器,1800
鉄のフライパン,調理器具,7800
") → {"key_columns":["カテゴリ","商品名"],"missing_products":["藍染めのふきん"],"sales_rows":3}
inspect_tables("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-04,大宮店,白磁のマグカップ,食器,5,9000
", "商品名,カテゴリ,定価
白磁のマグカップ,食器,1800
鋳物ホーロー鍋,調理器具,16800
積み重ね収納ボックス,収納,1500
") → {"key_columns":["カテゴリ","商品名"],"missing_products":[],"sales_rows":2}