PythonでCSVを集計する手順|Excelを開かずに件数と合計を出して検算する
PythonでCSVを集計する手順を解説します。pandasで日本語のCSVを読み、項目ごとの件数と合計を出し、元のデータと検算してExcelに保存するまでを、文字コードや桁区切りのつまずきとあわせて紹介します。
本記事はプロモーションを含みます。紹介する情報は、実際の成果や効果を保証するものではありません。
目次
この記事でわかること
- PythonでCSVを読み、項目ごとの件数と合計を出す手順
- 集計した結果を、元のデータと検算する方法
- 日本語のCSVで起きやすいつまずき(文字コード・桁区切り・空の項目)
- 集計の結果をExcelのファイルに保存する方法
毎月届くCSVをExcelで開き、科目や担当者ごとに件数と合計を出す作業は、同じ操作の繰り返しです。この記事では、Python の pandas というライブラリを使って、CSVを開かずに集計する最小の手順を紹介します。
外部の情報は、pandas と Python の公式の資料で確かめた内容だけを書きます。複数のExcelファイルを1つにまとめる方法は、Excelの複数ファイルを1つにまとめる方法で紹介しています。
Pythonで集計すると何が変わるか
先に結論を書くと、同じ集計を毎月くり返すなら、手順をコードにしておくと、毎回同じ結果を同じ確かめ方で出せます。 ただし、出した数字は毎回、元のデータと検算してから使います。
| やること | 担当 |
|---|---|
| 読み込み | Python |
| 件数と合計 | Python |
| 検算 | Python+人 |
| 使い道の判断 | 人 |
Pythonにするかの判断
迷ったときは、「同じ形のCSVが、これからも届くか」で決めます。届くたびに同じ集計をするなら、コードにする価値があります。1回だけの集計なら、Excelのピボットテーブルなどで十分なこともあります。
例にするCSV
この記事では、次のような経費のCSVを例にします。日付・科目・金額の3つの列があり、金額には「1,200」のように桁区切りのカンマが入っています。Windows の日本語の環境で作ったCSVを想定しています。
- 日付: 2026-09-01 のような日付
- 科目: 消耗品・交通費・通信費など
- 金額: 桁区切りのカンマ付きの数字
実際のデータで試す前に、同じ形の架空のCSVを作って試します。
手順: 件数と合計を出してExcelに保存する
次のコードは、sales.csv を読み、科目ごとの件数と合計を出して、summary.xlsx に保存します。元のCSVは書き換えません。
import pandas as pd
df = pd.read_csv("sales.csv", encoding="cp932",
thousands=",")
print("行数", len(df), "金額の合計", df["金額"].sum())
g = df.groupby("科目", dropna=False)["金額"]
summary = pd.DataFrame({"件数": g.size(),
"合計": g.sum()})
print(summary)
print("検算", summary["件数"].sum(),
summary["合計"].sum())
summary.to_excel("summary.xlsx")
pandas の公式の資料では、read_csv は、カンマで区切られた値(CSV)のファイルを DataFrame という表の形に読み込む関数です。groupby は、列の値でデータをまとまりに分けて、まとまりごとに計算するために使います。
- encoding="cp932": CSVの文字コードの指定です。指定しないと utf-8 として読みます。cp932 は、Python の公式の資料で日本語の文字コードの1つとして載っています
- thousands=",": 金額の桁区切りのカンマを、数字の一部として読む指定です
- dropna=False: 科目が空の行も、1つのまとまりとして数える指定です
- size(): まとまりごとの行数です
このコードは、架空の6行のCSVで動かし、科目ごとの件数と合計が出て、件数の合計が6、金額の合計がCSV全体の合計の8,640と同じになることを確かめました。動かした環境は、作業PCの Python 3.12.10 と pandas 3.0.6(Excel への保存には openpyxl 3.1.5)です。
集計した後に確かめること
集計した結果は、そのまま使わずに、次の2つを確かめます。コードの最後の「検算」の行で、両方の数字が表示されます。
- 件数: 科目ごとの件数を足した数が、CSVの行数と同じか
- 合計: 科目ごとの合計を足した値が、CSV全体の金額の合計と同じか
数字が合わないときは、次の「つまずきやすいところ」を確かめます。元のCSVとExcelで見比べるときは、summary.xlsx を開いて確かめます。
つまずきやすいところ
- 文字コードの指定を忘れる: 日本語のCSVを utf-8 として読もうとして、エラーになります。架空のCSVで試したときも、encoding を指定しないとエラーで止まりました
- 桁区切りのカンマを数字として読まない: thousands を指定しないと、金額が文字として読まれ、合計が正しく出ません。架空のCSVでも、指定しないと金額の列が文字の列になりました
- 科目が空の行が集計から消える: groupby の初期の設定では、まとまりに使う列が空の行は外れます。架空のCSVに科目が空の行を1つ足すと、初期の設定では件数の合計が行数より1少なくなり、dropna=False では行数と同じになりました
- 件数を count で数える: count は空でない値だけを数えます。金額が空の行があると、count の合計は行数より少なくなります。行数を数えるときは size を使います
Pythonの基本から学びたいときは、Pythonの学び方が参考になります。集計した結果から毎月同じ形の表を作る方法は、Claude CodeとPythonでExcelの定型レポートを自動作成する手順で紹介しています。
まとめ
- 同じ形のCSVを毎月集計するなら、手順をコードにしておくと同じ確かめ方で結果を出せます
- 日本語のCSVは、文字コード(cp932 など)と桁区切り(thousands)を指定して読みます
- 科目が空の行も数えるときは dropna=False、行数を数えるときは size を使います
- 集計した後は、件数と合計を元のデータと検算してから使います
よくある質問
CSVを読み込むと、文字化けやエラーになるのはなぜですか?
CSVの文字コードと、読み込むときの指定が合っていないことが多いです。pandas の read_csv は、指定しないと utf-8 として読みます。Windows の日本語の CSV なら、encoding に cp932 を指定して試します。
金額の合計が、数字として正しく出ないのはなぜですか?
「1,200」のように桁区切りのカンマが入った金額は、そのままだと文字として読まれます。read_csv の thousands にカンマを指定すると、数字として読めます。
集計した件数の合計が、元のCSVの行数と合わないのはなぜですか?
集計に使う項目が空の行は、groupby の初期の設定では集計から外れます。dropna=False を指定すると、空の項目も1つのまとまりとして数えられます。
Pythonを学んだことがなくても、この手順を使えますか?
コードはAIに書いてもらうこともできます。ただし、架空のデータで動かして、件数と合計が元のデータと合うことを自分で確かめてから使います。
集計した結果は、Excelでそのまま使えますか?
この記事のコードは、集計の結果を Excel のファイル(summary.xlsx)に保存します。元のCSVは書き換えないので、Excel で元のデータと見比べて確かめられます。