PythonでCSV集計を自動化するなら、最初の課題は「小さな表を読み込み、条件に合う行だけを集計し、手計算と照合する」にすると取り組みやすくなります。ファイルが出力されるだけでなく、何を数え、何を除外したかを説明できることが大切です。
この記事では、架空の学習記録12件を使います。正しく処理できれば、採用8件、除外4件、学習時間の合計305分になります。サンプルCSV、実行用のPythonコード、正解のCSVをダウンロードして、同じ結果を再現できます。実在する受講生や企業のデータではなく、記事用の練習教材です。
この記事でわかること
- CSVを科目別に集計する。
- 空欄・存在しない日付・重複した記録を見つける。
- 「元の12件=採用8件+除外4件」と、合計305分を確かめる。
- 元データを変えず、集計結果と除外理由を別ファイルに残す。
変数や繰り返し処理がまだ難しい場合は、Pythonのサンプルコード集で基本の書き方を確認しながら進めてください。
PythonでCSV集計を自動化する流れと準備

入力はstudy_log.csv、実行するファイルはaggregate.pyです。処理後は、指定した新しいフォルダーに3つのCSVができます。
| ファイル | 中身・確認すること |
|---|---|
| accepted.csv | 集計に使った8件。科目や時間を元データと照合する |
| rejected.csv | 除外した4件と理由。勝手に消えた行がないか確かめる |
| summary.csv | 科目ごとの件数と合計時間。手計算した答えと比べる |
実務でも、合計だけを出すと、取り込めなかった行に気づけないことがあります。今回は小さな教材ですが、採用したデータと除外したデータを両方残す流れを練習します。
集計する前に、正しいデータの条件を決める
まず、何を「正しい1件」と数えるかを決めます。数字を足す処理より先に、この条件をそろえてください。
| 列 | 今回のルール |
|---|---|
| record_id | Wと半角数字3桁。同じIDが再登場した行は除外 |
| date | YYYY-MM-DD形式で、実在する日付 |
| subject | 英語、Python、JavaScriptのいずれか |
| minutes | 半角数字で1〜1440分の整数。空欄・負数・小数は除外 |
これは教材のためのルールです。たとえば売上データでは、返品や調整を負の金額で表す場合があります。学習時間で使った「負数を除外する」という条件を、そのまま売上集計に移してはいけません。業務で使う前に、担当者と条件を決め直します。
重複の扱いにも注意が必要です。このコードは、同じIDが2回目以降に現れたら除外します。後の行が訂正版なのか、どちらも別の記録なのかを推測して修正する機能はありません。
サンプルCSVと正解を先に確認しよう
入力ファイルの最初の8件は、次のとおりです。ここでは計算を追いやすいように、ID・科目・時間を抜き出しています。
| ID | 科目 | 時間 |
|---|---|---|
| W001 | 英語 | 30分 |
| W002 | Python | 45分 |
| W003 | 英語 | 25分 |
| W004 | Python | 60分 |
| W005 | JavaScript | 40分 |
| W006 | 英語 | 35分 |
| W007 | Python | 20分 |
| W008 | JavaScript | 50分 |
残る4件には、あえて入力の問題を入れました。W009の日付は存在しない「2026-02-30」、W010の時間は空欄、W011の時間は「-10」です。最後の行ではW002が再登場します。自動で都合のよい値へ直すのではなく、理由を付けて集計から外します。
手計算の答えは、英語が30+25+35=90分、Pythonが45+60+20=125分、JavaScriptが40+50=90分。合計は90+125+90=305分です。先に正解を持っておくと、プログラムが出した数字をそのまま信じずに確認できます。
サンプルとコードをダウンロードして実行する

実習ファイル一式
aggregate.py、study_log.csv、起動手順、expectedフォルダー内の正解CSVを同梱しています。追加ライブラリのインストールは不要です。
Python 3.9以降が入ったPCで、ZIPを展開してください。ターミナルまたはコマンドプロンプトで、aggregate.pyがあるフォルダーを開きます。Macでは、cd と入力した後に展開したフォルダーをターミナルへドラッグすると、移動先のパスを入力できます。
Macなどでpython3コマンドを使う環境では、次を実行します。
python3 aggregate.py study_log.csv result01
WindowsでPythonランチャーのpyを使う環境では、次のように実行できます。自分の環境でPython 3を起動するコマンドに合わせてください。
py -3 aggregate.py study_log.csv result01
実行後に表示される答えは、次のとおりです。
入力12件 / 採用8件 / 除外4件 / 合計305分
英語: 3件 / 90分
Python: 3件 / 125分
JavaScript: 2件 / 90分
同じ場所にできたresult01フォルダーを開き、3つのCSVを確認しましょう。もう一度実行するときはresult02など、まだ存在しないフォルダー名に変えます。前回の結果を上書きしないよう、この教材では既存の出力フォルダーを指定すると中断します。
CSV集計コードを4つの処理に分けて読む

1.CSVを列名で読み取る
標準ライブラリのcsv.DictReaderを使うと、1行のデータを列名で取り出せます。たとえばrow['subject']が科目、row['minutes']が時間です。
with source.open(encoding='utf-8-sig', newline='') as handle:
reader = csv.DictReader(handle, strict=True)
if reader.fieldnames != FIELDS:
raise ValueError('列名と順番を確認してください。')
for row in reader:
subject = row['subject']
minutes = row['minutes']
上は読み込み部分を短くした説明用の抜粋です。配布コードには、列数、日付、重複などの検証も入っています。CSVから取り出した数字は基本的に文字列なので、足し算の前に整数へ変換します。CSVファイルを開く際のnewline=''指定やDictReaderの動作は、Python公式のcsvモジュールの説明で確認できます。
2.入力を確かめてから数値へ変える
空欄のままint()に渡すと、整数にできません。今回のコードは半角数字かどうかと範囲を確かめ、問題がない行だけvalidという一覧へ入れます。日付は書式だけでなく、実際に存在する日かも確認します。
「2026-02-30」は見た目の形式が整っていても存在しません。date.fromisoformat()による変換を使って検出しています。形式と有効な日付の関係は、Python公式のdate.fromisoformatを参照してください。
3.科目が同じ行を集めて足す
検証が終わったvalidの中から同じ科目の時間を取り出し、件数と合計を求めます。配布コードの集計部分は次の形です。
summary = []
for subject in SUBJECTS:
minutes = [row['minutes'] for row in valid
if row['subject'] == subject]
summary.append(dict(
subject=subject,
records=len(minutes),
minutes=sum(minutes)
))
英語の番なら、時間の一覧は[30, 25, 35]になります。len()で3件、sum()で90分です。最初はこの一覧を紙に書いて追ってみると、集計の意味をつかみやすくなります。
4.合計と除外理由を別々に書き出す
結果はcsv.DictWriterで書き出します。元のCSVを読む処理と、結果を新しいフォルダーへ保存する処理を分けているので、練習で失敗しても元データからやり直せます。教材の出力はUTF-8のBOM付きです。表計算ソフトで文字が崩れる場合は、開き方と読み込み時の文字コードも確認してください。
集計結果の答え合わせと、エラーの確認方法

合計が305分なら終わり、とはせず、次の3点を照合します。別の間違いが打ち消し合って、合計だけが一致する可能性もあるためです。
- 科目別の合計:英語90分、Python125分、JavaScript90分か。
- 件数:入力12件が、採用8件と除外4件に分かれているか。
- 除外理由:日付不正、時間の空欄、負数、ID重複の4件か。
記事制作時には、2026年10月5日にmacOS・Python 3.9.6で実行し、この答えとの一致を確認しました。さらに元CSVの内容が変わらないこと、既存の出力先への上書きを拒むこと、0・1・1440・1441の境界、小数・全角数字、うるう日、列名・列数の誤りを含む9項目を検証しています。Windowsでの実行確認や、大量データでの速度測定は行っていません。
うまく動かないときに見る場所
| 状況 | 確認すること |
|---|---|
| python3やpyが見つからない | Pythonが導入されているか、自分の環境で使う起動コマンドは何か |
| ファイルがないと表示される | ターミナルで開いているフォルダーと、CSV・Pythonファイルの場所 |
| 出力先が既に存在する | result02など、まだ使っていないフォルダー名に変更 |
| 列名のエラーになる | 先頭行がrecord_id,date,subject,minutesで、順番も同じか |
| 採用件数が少ない | rejected.csvのreason列。科目名の違いや入力規則を確認 |
エラーの文をAIに相談する場合も、まずダミーデータで再現してください。「入力12件、採用8件の想定なのに7件だった。除外理由はこれ」と伝えると、確認すべき箇所を絞れます。業務の実データをそのまま外部サービスへ貼り付ける必要はありません。
次の練習:1行追加して、答えを予測する
サンプルのコピーに、ID「W012」、日付「2026-10-05」、科目「Python」、時間「15」の行を追加してください。実行前に答えを予測します。
正解は、入力13件、採用9件、除外4件、合計320分です。Pythonは4件・140分になります。続いて、その行の科目を「python」の小文字へ変えてみましょう。今回の規則では別の文字列なので除外され、元の305分へ戻ります。大文字小文字を同じものとして扱いたければ、業務ルールと変換処理を追加する必要があります。
このように、1か所だけ変える→先に答えを書く→実行結果と比べると進めると、コードをコピーして終わらずに理解を深められます。別の題材に進むなら、Pythonの練習問題と学習サイトも活用してください。
よくある質問
pandasをインストールしなくてもCSV集計はできますか?
今回のような小さな表は、Python標準ライブラリのcsvと繰り返し処理で集計できます。複数の表の結合や複雑な集計を行う段階で、pandasなどを検討しても遅くありません。
このコードを会社のCSVへそのまま使えますか?
列名、文字コード、ID、科目、時間のルールを教材用に固定しているので、そのまま適用できるとは限りません。まず実データのコピーを用意し、正しい集計条件と既知の答えを確認してから変更してください。
自動化で何分短縮できますか?
この教材では時間短縮を測定していません。実務で評価するなら、同じ件数・同じ確認範囲について、準備、実行、除外行の確認、修正を含む時間を比較します。コードの実行時間だけで判断しないようにしましょう。
まとめ:正しい答えを確かめられる自動化にしよう
CSVを読めたら、次は「どの行を数えたのか」「除外した理由は何か」「手計算と一致するか」を確認してください。この3点がそろうと、別のデータに広げるときも、何を変えればよいか考えやすくなります。
プログラミングと英語の学び方を相談したい方へ
KredoではITと英語を学ぶ留学プログラムを案内しています。このPython教材が各コースの授業内容を示すものではありません。自分が学びたい技術や作りたいものに合うかを、相談時に確認してください。
英語でIT・AIを学べるKredo
英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?
当メディアを運営しているKredoは、英語×ITをオンラインで学ぶ「Kredoオンラインキャンプ」と、フィリピンのセブ島で英語とIT・AIを学ぶ「KredoIT留学」「KredoAI留学」を提供しています。これまでの卒業生は3,000名以上。卒業生の多くが、国内外のIT企業への転職、フリーランスなどへのキャリアチェンジを実現しています。これからの時代に必要な英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?











