縦に積む
このレッスンでできるようになること。concat を使い、店舗ごとに分かれた売上ファイルを1つの表に積み上げられるようになります。
マイショップ・チェーンの売上データは、実際には店舗ごとに別のファイルで届きます。渋谷店のCSV、横浜店のCSV、大宮店のCSV、という具合です。分析するには、これを1つの表にまとめる必要があります。merge が横につなぐ操作だったのに対し、concat は縦に積む操作です。
Python
all_sales = pd.concat([shibuya, yokohama, omiya], ignore_index=True)merge と concat の違いをはっきりさせておきます。merge は「同じ行に別の情報を足す」、concat は「同じ形の表に別の行を足す」操作です。列の構成が同じ表を並べるなら concat、鍵でつなぐなら merge です。
ignore_index=True は必ず付けてください。付けないと、それぞれの表が持っていた0から始まる行番号がそのまま残り、結合後の表に0が3つ並ぶことになります。あとで loc で行を取り出そうとしたときに、意図しない複数行が返ってきて混乱します。
列がずれている場合の挙動も知っておく価値があります。片方の表にだけ 備考 という列があると、concat した結果には 備考 列ができ、持っていなかった側の行は NaN になります。列が消えるのではなく増える方向に働くので、データは失われません。ただし、列名の表記ゆれ(金額 と 売上金額 など)があると別々の列として扱われ、値がばらけます。積む前に列名を揃えておくのが安全です。
積んだあとに必ずやることが2つあります。1つは行数の確認です。元の3つの表の行数の合計と一致していれば、取りこぼしはありません。もう1つは、店舗を表す列があるかの確認です。ファイル名でしか店舗を区別していなかった場合、積んだ瞬間にどの行がどの店舗のものか分からなくなります。届いたCSVに 店舗 列が無いなら、積む前に自分で足す必要があります。この一手間が、次のレッスンで作る統合データセットの前提になります。
要件
- 各店舗の表に 店舗 列を足してから積む
- concat に ignore_index=True を渡す
- columns は昇順に並べたリストにする
- by_store は積んだあとの表から groupby で求める
入出力例
stack_stores({"横浜店":"売上日,商品名,カテゴリ,数量,金額\n2026-01-06,鉄のフライパン,調理器具,1,7800\n","渋谷店":"売上日,商品名,カテゴリ,数量,金額\n2026-01-05,白磁のマグカップ,食器,2,3600\n2026-01-08,木製カッティングボード,調理器具,1,4200\n"}) → {"by_store":{"横浜店":7800,"渋谷店":7800},"columns":["カテゴリ","商品名","売上日","店舗","数量","金額"],"rows":3}
stack_stores({"大宮店":"売上日,商品名,カテゴリ,数量,金額\n2026-03-01,積み重ね収納ボックス,収納,3,4500\n2026-03-02,布製収納バスケット,収納,2,3000\n2026-04-01,白磁のマグカップ,食器,4,7200\n"}) → {"by_store":{"大宮店":14700},"columns":["カテゴリ","商品名","売上日","店舗","数量","金額"],"rows":3}