L09 ch04 — pandas で CSV
テクノロジ系 / L09 file-io — ファイル永続化
L09 ch04 — pandas で CSV
データ操作の業界標準ライブラリ
ゴール
pd.read_csv/df.to_csvで CSV 読み書き- DataFrame でフィルタ・集計
- データ分析でなく業務処理にも便利
インストール
uv add pandas
読み込み
import pandas as pd
df = pd.read_csv("tasks.csv")
print(df.head())
# id title done
# 0 1 買い物 False
# 1 2 掃除 True→ 型推論で自動的に int / bool / str に変換
フィルタ
# done=True のみ done_df = df[df["done"] == True] # 複数条件 df[(df["done"] == False) & (df["id"] > 1)]
集計
df["done"].sum() # True の数
df.groupby("done").count() # 完了/未完了の件数
df["title"].str.len().mean() # title 平均文字数書き込み
df.to_csv("output.csv", index=False, encoding="utf-8")index=False で行番号 (0,1,2...) を出力しない。
罠
- pandas は依存が大きい (numpy 等)、軽量処理なら csv モジュールで十分
- メモリ使用量大 → 巨大 CSV は
chunksizeでストリーミング - 型推論がうまくいかない場合
dtype指定で明示
業務での用途
- 月次レポート集計
- データクレンジング
- API データの Excel 出力 (
df.to_excel) - DB データの加工 (
pd.read_sql)
drill
drill/ — DataFrame で CSV フィルタ
csv モジュール vs pandas
| 観点 | csv (標準ライブラリ) | pandas |
|---|---|---|
| 依存 | なし | numpy + pandas (= 重い) |
| 読み込み速度 | 速い | 巨大データに最適化 |
| メモリ | 行ストリーミング可能 | 全件メモリ展開 |
| フィルタ・集計 | 自前 | df[df.col>0] / groupby |
| Excel 出力 | 不可 | df.to_excel() |
| 型推論 | なし (全 str) | 自動 |
→ 軽量処理は csv / 集計が必要なら pandas。
巨大 CSV のストリーミング
メモリに乗らない CSV は chunk で読む:
import pandas as pd
total = 0
for chunk in pd.read_csv("huge.csv", chunksize=10_000):
total += chunk["amount"].sum()
print(total)→ メモリ使用量は chunk サイズだけで済む。
dtype 明示
型推論が暴走するケース (= ZIP コード 01234 が 1234 になる) を防ぐ:
df = pd.read_csv("data.csv", dtype={"zip": str, "id": int})業務での典型ワークフロー
# 1. 複数 CSV を結合
df_a = pd.read_csv("sales_2025.csv")
df_b = pd.read_csv("sales_2026.csv")
df = pd.concat([df_a, df_b], ignore_index=True)
# 2. クレンジング
df = df.dropna(subset=["amount"]) # 欠損行除去
df["amount"] = df["amount"].astype(int)
# 3. 集計
result = df.groupby("category")["amount"].sum()
# 4. Excel に出力 (取引先に渡す形式)
result.to_excel("report.xlsx", index=True)次に学ぶ領域
| 領域 | 続けて読む |
|---|---|
| シンプルな CSV | ch03-csv |
| データ可視化 (matplotlib / plotly) | 将来の chapter |
データベース連携 (pd.read_sql) | db/ |
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。