カテゴリー

  • プログラミング
  • 英語学習
  • 海外
  • キャリア
  • Kredo
Kredoオンラインキャンプ
KredoIT留学
無料カウンセリングはこちら
Kredoオンラインキャンプ体験談
KredoIT留学体験談
外貨を稼ぐ!海外フリーランス無料セミナー
未経験から即戦力ITグローバル人材 無料セミナー
Kredo Blog 英語・IT・AIで、人生の選択肢を広げる。
無料ウェビナー参加 ↗ 無料カウンセリング予約無料相談↗
MENU
EXPLORE KREDO BLOG

知りたいことから、世界が広がる。

ブログTOP ↗
留学・セブSTUDY & LIFE
留学・セブの記事をすべて読む ↗ 海外留学→海外移住→海外就職→
英語学習ENGLISH
英語学習の記事をすべて読む ↗ 英語学習法→英語フレーズ→
IT・AITECH & CREATIVITY
IT・AIの記事をすべて読む ↗ プログラミング学習→プログラミング知識→AI・テクノロジー→デザイン→
キャリアYOUR NEXT CHAPTER
キャリアの記事をすべて読む ↗ 転職情報→キャリアデザイン→
KredoOUR SCHOOL
Kredoの記事をすべて読む ↗ ニュース・キャンペーン→セブ島情報→インタビュー→
STUDENT DIARIES留学生のリアルな日記noteの体験記を読む ↗YouTube・Instagramで留学を知る ↗
記事を探す ブログTOP
留学・セブ
STUDY & LIFEセブで学ぶ。海外で暮らす。留学の準備から、現地の毎日まで。
留学・セブを知るすべての記事 ↗
海外留学費用・期間・学校選びを知る↗海外移住海外で暮らすためのヒント↗海外就職世界で働く選択肢を探す↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
英語学習
ENGLISH英語が、世界を近くする。学び方と、今日から使える英語。
英語学習を知るすべての記事 ↗
英語学習法自分に合った学び方を見つける↗英語フレーズ会話で使える表現を読む↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
IT・AI
TECH & CREATIVITYつくる力を、次の一歩に。プログラミングとAIをもっと身近に。
IT・AIを知るすべての記事 ↗
プログラミング学習はじめ方・学び方を知る↗プログラミング知識仕組みやスキルを深める↗AI・テクノロジーAIの活かし方と最新の話題↗デザイン伝わるものづくりのヒント↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
キャリア
YOUR NEXT CHAPTER学びの先の、働き方。転職・海外就職・これからのキャリア。
キャリアを知るすべての記事 ↗
転職情報次の仕事へ向かう準備↗キャリアデザイン自分らしい働き方を考える↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
Kredo
OUR SCHOOLKredoを、もっと知る。学校のこと、セブのこと、学ぶ人のこと。
Kredoを知るすべての記事 ↗
ニュース・キャンペーンKredoからのお知らせ↗セブ島情報現地の暮らしを知る↗インタビュー受講生・卒業生の声を読む↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
留学日記 ↗

ENGLISH · IT · AI / STUDY IN CEBU

学ぶって、冒険だ。

英語・IT・AIで、人生の選択肢を広げよう。

留学の無料相談へ ↗Kredo Blogを読む →
JAPAN✈CEBU
Kredoで、講師と一緒に英語とITを学ぶ受講生
LEARN SOMETHING NEW.
セブの海を望む場所で学ぶ日常
HELLO, NEW WORLD.
  • TOP
  • プログラミング
  • Web・プログラミング(学習)
  • PythonでCSV集計を自動化する方法|サンプルとコード付き

PythonでCSV集計を自動化する方法|サンプルとコード付き

アバター画像
Kredo編集部
公開日:2026.10.05
更新日:2026.10.10
Web・プログラミング(学習) |
PythonでCSV集計を学ぶ机とパソコンのイメージ写真

こんにちは、Kredo Blog編集部です。

PythonでCSV集計を自動化するなら、最初の課題は「小さな表を読み込み、条件に合う行だけを集計し、手計算と照合する」にすると取り組みやすくなります。ファイルが出力されるだけでなく、何を数え、何を除外したかを説明できることが大切です。

この記事では、架空の学習記録12件を使います。正しく処理できれば、採用8件、除外4件、学習時間の合計305分になります。サンプルCSV、実行用のPythonコード、正解のCSVをダウンロードして、同じ結果を再現できます。実在する受講生や企業のデータではなく、記事用の練習教材です。

変数や繰り返し処理がまだ難しい場合は、Pythonのサンプルコード集で基本の書き方を確認しながら進めてください。

記事のもくじ

  • PythonでCSV集計を自動化する流れと準備
    • 集計する前に、正しいデータの条件を決める
    • サンプルCSVと正解を先に確認しよう
  • サンプルとコードをダウンロードして実行する
  • CSV集計コードを4つの処理に分けて読む
    • 1.CSVを列名で読み取る
    • 2.入力を確かめてから数値へ変える
    • 3.科目が同じ行を集めて足す
    • 4.合計と除外理由を別々に書き出す
  • 空欄・0・列不足を、入力を変えずに見分ける
    • 「0がある」と「何もない」を一つの条件にまとめない
    • 14件の診断教材を実行して、理由を読み比べる
    • 練習:1か所だけ変えて、診断結果を予想する
  • 集計結果の答え合わせと、エラーの確認方法
    • うまく動かないときに見る場所
    • 次の練習:1行追加して、答えを予測する
  • よくある質問
    • pandasをインストールしなくてもCSV集計はできますか?
    • このコードを会社のCSVへそのまま使えますか?
    • 自動化で何分短縮できますか?
  • まとめ:正しい答えを確かめられる自動化にしよう

PythonでCSV集計を自動化する流れと準備

入力12件を採用8件と理由付きの除外4件に分けるCSV集計の図解
この教材では、入力12件を採用8件と除外4件に分けます。除外した行も理由を付けて残します。

入力は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分です。先に正解を持っておくと、プログラムが出した数字をそのまま信じずに確認できます。

サンプルとコードをダウンロードして実行する

教材を展開し実行して結果を確認する3つの手順
教材を展開し、コードを実行して、同じ結果が出るか確かめます。写真は学習場面のイメージ(AI生成)です。

実習ファイル一式

CSV集計のサンプル・コード・正解をダウンロード(ZIP)

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つの処理に分けて読む

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付きです。表計算ソフトで文字が崩れる場合は、開き方と読み込み時の文字コードも確認してください。

空欄・0・列不足を、入力を変えずに見分ける

空欄は未入力、0はゼロという値、列不足は項目が足りない状態として区別する水彩図解
空欄、値としての0、列数の不足は、確認する理由が異なります。図は3つの状態を表したイメージです。

ここまでの集計では、時間が空欄の行も、0分の行も対象から外れます。ただし、同じ「採用しない」でも理由は違います。空欄を0で埋めてから調べると、元は未入力だったのか、本当に0が入っていたのかが分からなくなります。

まず、読み取った値と元の列数をそのまま確かめましょう。以下は、record_id,minutesの2列だけを使った別の練習です。先ほどの12件・305分のCSVとは混ぜずに扱います。

CSVの記録 読み取り後のminutes 今回の診断 確認すること
V001,30 '30' 有効な時間 半角数字で1〜1440
V002, '' 空欄 値が入力されていない
V003," " ' ' 空白だけ 見えない空白文字が入っている
V004,0 '0' 範囲外 値はあるが、この教材では0分を数えない
V005 None 列不足 2列のはずが1列しかない
V006,30,extra '30'と余分な列 列が多い 時間が数値でも、構造を確認する
V007,NULL 'NULL' 整数の形式ではない 文字のNULLを欠損へ自動変換しない

この表は、標準のcsv.DictReaderを通常の設定で使った場合です。列が足りないと、足りない値に既定でNoneが入り、列が余ると既定でNoneというキーに余分な値が入ります。空の欄が返す空文字とは区別してください。Python公式:DictReaderの列不足・余剰列の扱い

「0がある」と「何もない」を一つの条件にまとめない

CSVから通常の設定で読み取った'0'は、数値の0ではなく文字列です。Pythonでは空文字''やNone、数値の0は偽として扱われますが、文字列'0'は空ではないため真になります。そのため、if not value:だけで空欄・列不足・0を分類しようとすると、変換前か後かでも意味が変わります。Python公式:真偽値の判定

追加教材では、まず列不足、空文字、空白だけを順に調べ、その後に半角数字か、1〜1440の範囲内かを判定します。配布コードの最初の部分は次のとおりです。

def classify_minutes(raw):
    if raw is None:
        return "COLUMN_MISSING"
    if raw == "":
        return "EMPTY"
    value = raw.strip()
    if value == "":
        return "WHITESPACE_ONLY"

これは関数の冒頭だけの抜粋です。続きの形式・範囲の判定も含む実行用コードは、下の教材に入っています。strip()で前後の空白を取り除くのは判定用の変数だけです。元ファイルの値を置き換える処理ではありません。' 30 'は、前後の空白を除くと条件を満たすことも区別して表示します。

なお、0を使ってよいかはデータの意味次第です。この学習時間の課題では対象外ですが、件数や在庫など別のデータでは正しい0があり得ます。空欄を0に置き換える前に、何を表す値なのかを確認してください。

14件の診断教材を実行して、理由を読み比べる

空欄・0・列不足の診断教材をダウンロードする(ZIP)には、診断コード、架空のCSV14件、期待する出力、テスト、READMEを入れています。追加ライブラリは不要です。ZIPを展開し、inspect_minutes.pyがあるフォルダーで実行します。

Macなどでpython3を使う場合:

python3 -B inspect_minutes.py missing_cases.csv

WindowsのPythonランチャーを使う場合:

py -3 -B inspect_minutes.py missing_cases.csv

表示結果は次のとおりです。repr()形式で表示するため、空文字、空白、文字列の0、Noneを見比べられます。

01 V001: '30' -> VALID
02 V002: '' -> EMPTY
03 V003: '   ' -> WHITESPACE_ONLY
04 V004: '0' -> OUT_OF_RANGE
05 V005: None -> COLUMN_MISSING
06 V006: '30' -> EXTRA_COLUMN
07 V007: 'NULL' -> NOT_INTEGER
08 V008: '30分' -> NOT_INTEGER
09 V009: '0' -> NOT_INTEGER
10 V010: '1440' -> VALID
11 V011: '1441' -> OUT_OF_RANGE
12 V012: '-10' -> NOT_INTEGER
13 V013: '3.5' -> NOT_INTEGER
14 V014: ' 30 ' -> VALID_AFTER_TRIM
Checked 14 records; valid minutes: 3; review: 11.
Input file unchanged; no output files created.

VALIDは時間の条件を満たす記録、VALID_AFTER_TRIMは前後の空白を除くと条件を満たす記録です。合わせて3件、確認する記録は11件になります。ここでの「有効」は、この2列の診断で確認した範囲を指します。IDの形式や重複、日付・科目まで検証した結果ではありません。

V005の列不足とV006の余分な列を表示するのは、原因を比べるためです。先ほどの集計コードは、このような列数の不一致があれば全体を中断します。問題の行を黙って捨てたり、足りない列を補って集計したりはしません。

表示の先頭の01〜14は、読み取ったデータの順番です。引用符の中に改行が入るCSVでは、ファイルの物理行番号とは一致しないことがあります。また、この診断プログラムは読取用のrモードで入力を開き、結果を画面へ出すだけで、新しいファイルを作りません。Python公式:openの読取モード

2026年10月6日、macOSのPython 3.9.6と3.12で、14件の結果を正解と照合しました。さらに8項目のテストで、境界値、前後の空白、BOM、列名の違い、CSVの構文・文字コードエラー、元CSVのハッシュ不変、新規ファイルが作られないことを確認しています。Windowsの画面操作や大量データでの性能は今回の検証範囲に含めていません。

練習:1か所だけ変えて、診断結果を予想する

元のCSVは残し、自分でコピーを作ってから試します。コピーのV004,0をV004,1に変えると、時間の条件を満たす記録は4件、確認する記録は10件になります。次に別のコピーでV005の末尾へカンマを加えてV005,にすると、列不足が空欄へ変わり、件数は3件・11件のままです。

こうして「どの理由が変わり、どの件数は変わらないか」を予測すると、欠損をまとめて埋める前に、必要な確認を考えられます。日本語を読み取る段階で失敗する場合は、値の診断に入る前にCSVの文字コードとBOMを確認する実習で切り分けてください。

集計結果の答え合わせと、エラーの確認方法

英語90分、Python125分、JavaScript90分の合計305分と件数・除外理由の照合
合計305分だけでなく、科目別の内訳、採用8件、除外4件とその理由を照合します。

合計が305分なら終わり、とはせず、次の3点を照合します。別の間違いが打ち消し合って、合計だけが一致する可能性もあるためです。

  1. 科目別の合計:英語90分、Python125分、JavaScript90分か。
  2. 件数:入力12件が、採用8件と除外4件に分かれているか。
  3. 除外理由:日付不正、時間の空欄、負数、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の練習問題と学習サイトも活用してください。

あわせて読みたい記事

PythonのCSV読み込みで列がずれる原因と直し方
PythonのCSV読み込みで列がずれる原因と直し方
2026-10-05

Pythonの英語エラーの読み方|6種類の原因と直し方
Pythonの英語エラーの読み方|6種類の原因と直し方
2026-10-05

よくある質問

pandasをインストールしなくてもCSV集計はできますか?

今回のような小さな表は、Python標準ライブラリのcsvと繰り返し処理で集計できます。複数の表の結合や複雑な集計を行う段階で、pandasなどを検討しても遅くありません。

このコードを会社のCSVへそのまま使えますか?

列名、文字コード、ID、科目、時間のルールを教材用に固定しているので、そのまま適用できるとは限りません。まず実データのコピーを用意し、正しい集計条件と既知の答えを確認してから変更してください。

自動化で何分短縮できますか?

この教材では時間短縮を測定していません。実務で評価するなら、同じ件数・同じ確認範囲について、準備、実行、除外行の確認、修正を含む時間を比較します。コードの実行時間だけで判断しないようにしましょう。

まとめ:正しい答えを確かめられる自動化にしよう

CSVを読めたら、次は「どの行を数えたのか」「除外した理由は何か」「手計算と一致するか」を確認してください。この3点がそろうと、別のデータに広げるときも、何を変えればよいか考えやすくなります。

プログラミングと英語の学び方を相談したい方へ

KredoではITと英語を学ぶ留学プログラムを案内しています。このPython教材が各コースの授業内容を示すものではありません。自分が学びたい技術や作りたいものに合うかを、相談時に確認してください。

Kredo IT留学の無料カウンセリングを見る

英語でIT・AIを学べるKredo

英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?

当メディアを運営しているKredoは、英語×ITをオンラインで学ぶ「Kredoオンラインキャンプ」と、フィリピンのセブ島で英語とIT・AIを学ぶ「KredoIT留学」「KredoAI留学」を提供しています。これまでの卒業生は3,000名以上。卒業生の多くが、国内外のIT企業への転職、フリーランスなどへのキャリアチェンジを実現しています。これからの時代に必要な英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?

\ セブ島でIT×英語を学ぶ /IT留学の無料カウンセリングを予約する
\ オンラインでIT✕英語を学ぶ / Kredoオンラインキャンプの詳細をみる >>
  • ツイート
  • シェア
  • はてな
  • ポケット
この記事を書いた人
アバター画像
Kredo編集部

関連記事

  • sort()は元のリストを並べ替えて戻り値がNone、sorted()は元のデータを残して新しいリストを返す比較図
    Web・プログラミング(学習)

    Pythonのsortとsortedの違い|英語の公式仕様で元データ・戻り値を確認

    2026.10.08
  • 机の上で色分けした注文カードと明細カードを並べ、結合後のカードを見比べる学習イメージ
    Web・プログラミング(学習)

    SQLのJOINで行数・合計が増える原因は?1対多と直し方を図解

  • 追加した項目の動きをノートで整理する学習者の写真イメージ
    プログラミング Web・プログラミング(学習)

    JavaScriptのイベント委譲とは?追加したボタンが動く仕組みを実験

    2026.10.06
  • フォームの入力条件をノートで整理する学習者の写真イメージ
    プログラミング Web・プログラミング(学習)

    フォームの入力チェックの作り方|HTMLとJavaScriptで空白・文字数を確認

新規CTA
KREDO JAPAN株式会社

\ SNSで留学の様子を更新中! /

  • Instagram
  • LINE
  • X
  • YouTube
©KREDO JAPAN Inc. 2024 All rights reserved.
Kredoのサービス
セブ島で学びたい方はこちら KredoIT留学
自宅で学びたい方はこちら Kredo Online 英語×アプリ開発コース
運営会社 会社概要 採用情報 お問い合わせ
利用規約 プライバシーポリシー 特定商品取引に基づく表示 資料請求