毎朝、こんな作業をしていませんか?
- 「システムからダウンロードした複数のCSVを、Excelで1つにまとめている」
- 「商品ごとの合計を出すために、毎回ピボットテーブルを作り直している」
- 「たまにコピペの範囲を間違えて、数字が合わなくなる」
毎日同じ手順で繰り返している集計は、Pythonにいちばん任せやすい作業です。
今回は、pandasを使って複数のCSVをまとめて集計し、結果をファイルに保存するところまでを自動化する方法を紹介します。
手作業の集計に潜む落とし穴
手作業の集計で怖いのは、時間がかかることだけではありません。
- コピペの範囲がずれる
- 古いファイルを開いたまま集計してしまう
- 担当者によって手順が微妙に違う
こうしたミスは、作業に慣れてきたころにこそ起こりやすいものです。
手順をコードにしておけば、毎回まったく同じ処理が行われるので、ミスが入り込む余地を減らせます。
pandasで読み込みと集計をする
まずは、スクリプトを置くフォルダで仮想環境(venv)を作り、pandasをインストールします。
最近のmacOSやLinuxでは、システムのPythonに直接 pip install するとエラーになることがあるためです。
- 1
- 2
- 3
python3 -m venv .venv
source .venv/bin/activate # Windowsは .venv\Scripts\activate
pip install pandas今回は、data/input フォルダに置いたCSV(「日付」「商品名」「金額」の列を持つもの)をすべて読み込み、商品ごとに集計する例です。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
from datetime import date
from pathlib import Path
import pandas as pd
# スクリプトの場所を基準にフォルダを決める(定期実行でもパスがずれない)
BASE_DIR = Path(__file__).resolve().parent
INPUT_DIR = BASE_DIR / "data" / "input"
OUTPUT_DIR = BASE_DIR / "data" / "output"
def main() -> None:
files = sorted(INPUT_DIR.glob("*.csv"))
if not files:
print("CSVファイルが見つかりません")
return
# すべてのCSVを読み込んで1つの表にまとめる
df = pd.concat((pd.read_csv(f, encoding="utf-8") for f in files), ignore_index=True)
# 商品ごとに売上合計と件数を集計する
summary = (
df.groupby("商品名", as_index=False)
.agg(売上合計=("金額", "sum"), 件数=("金額", "count"))
.sort_values("売上合計", ascending=False)
)
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
output_path = OUTPUT_DIR / f"summary_{date.today():%Y%m%d}.csv"
summary.to_csv(output_path, index=False, encoding="utf-8-sig")
print(f"集計結果を保存しました:{output_path}")
if __name__ == "__main__":
main()ポイントは次の3つです。
-
glob("*.csv")で、フォルダ内のCSVをまとめて取得している -
groupbyとaggで、ピボットテーブルと同じような集計をしている - 保存時の
encoding="utf-8-sig"で、Excelで開いても文字化けしにくくしている
システムから出力されたCSVがShift_JISの場合は、読み込み時の encoding を "cp932" に変更してください。
最後の if __name__ == "__main__": が気になった方は、こちらの記事で解説しています。
Pythonの「おまじない」って何?「if name == "main"」の正体と意味をやさしく解説!
定期実行で「毎朝の作業」をなくす
スクリプトができたら、毎朝自動で動くように設定しましょう。
Mac・Linuxの場合(cron)
ターミナルで crontab -e を実行し、次の1行を追加します。
- 1
- 2
# 平日の朝8時に実行し、ログをファイルに残す
0 8 * * 1-5 /path/to/.venv/bin/python /path/to/summarize.py >> /path/to/summarize.log 2>&1cronでは仮想環境のPythonをフルパスで指定してください(/path/to/.venv/bin/python の部分を、実際に作成した仮想環境の場所に置き換えます)。
Windowsの場合(タスクスケジューラ)
タスクスケジューラで「基本タスクの作成」を選び、次のように設定します。
- トリガー:毎日、または毎週(曜日を指定)
- 操作:プログラムの開始
- プログラム/スクリプト:仮想環境の
python.exeのフルパス(例:C:\path\to\.venv\Scripts\python.exe) - 引数の追加:
summarize.pyのフルパス
スクリプト内でフォルダの場所を __file__ 基準にしているので、どこから実行されてもパスがずれません。
まとめ
今回は、pandasを使って毎朝のCSV集計を自動化する方法を紹介しました。
- 複数のCSVをまとめて読み込む
-
groupbyで集計し、Excelで開ける形で保存する - cronやタスクスケジューラで定期実行する
データが増えて処理が遅くなってきたら、こちらの記事も参考にしてみてください。
Pythonの処理が遅いと感じたとき、本当に見直すべきポイント
毎朝の10分が、毎日自動で返ってくる。そんな小さな自動化から始めてみてくださいね。