この記事でわかること

  • 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 を使います
  • 集計した後は、件数と合計を元のデータと検算してから使います