ここで使うデータは sample-data で整形した
soumu-gdp-clean.csvです。
from pathlib import Path
import pandas as pd
DATA = Path("../data/processed/soumu-gdp-clean.csv")
df = pd.read_csv(DATA)
df.head()
1. メタ情報の確認 #
df.info()
df.describe().T[['mean','std','min','max']].round(2).head()
info()で列数・行数・欠損を俯瞰describe()を転置し、代表値を一括確認df.columns/df.dtypesで名称と型を列挙
列の正規化 #
df.columns = (
df.columns
.str.replace("年度", "")
.str.replace("令和", "R")
.str.replace("平", "H")
)
略称を統一しておくと filter(regex="^H") などの抽出が楽になります。
2. 行・列選択 (loc / iloc)
#
df.loc[df["カテゴリ"] == "社会保障関係費", ["カテゴリ", "H1", "H10", "R1"]]
df.iloc[:3, :5] # 位置ベース
loc[条件, 列]で意味ベースの抽出iloc[行番号, 列番号]で位置ベースの抽出
頻出パターンを関数化しておくと便利です。
def pick(category, cols):
return df.loc[df["カテゴリ"] == category, cols]
pick("教育費", ["H1", "H5", "R1"])
3. 行フィルタと新列 #
mask = (df["R1"] - df["H1"]) > 5
growth = (
df.assign(
diff = df["R1"] - df["H1"],
avg = df.filter(regex="^(H|R)").mean(axis=1)
)
.loc[mask, ["カテゴリ", "diff", "avg"]]
.sort_values("diff", ascending=False)
)
growth.head()
assignで中間計算を列に持たせる- 行フィルタ条件を
mask変数に入れて可読性を上げる filter(regex=...)で年次列をまとめて扱う
4. 形の変換(long/ wide) #
value_cols = df.columns[df.columns != "カテゴリ"]
tidy = (
df.melt(
id_vars="カテゴリ",
value_vars=value_cols,
var_name="year",
value_name="value"
)
.assign(
year = lambda x: x["year"].str.replace("H", "19").str.replace("R", "20").astype(int)
)
)
tidy.head()
melt で long 形式をつくっておくと、groupby や可視化ライブラリに渡しやすくなります。
逆に列を広げたい場合は pivot_table を使用します。
pivot = tidy.pivot_table(
index="year",
columns="カテゴリ",
values="value"
)
5. 書き出しとログ #
df.to_parquet("../data/processed/soumu-gdp-clean.parquet", index=False)
tidy.to_csv("../data/processed/soumu-gdp-tidy.csv", index=False, encoding="utf-8-sig")
- 保存形式は CSV と Parquet の二本立てにしておくと活用の幅が広がる
- 書き出し前に
df.isna().sum()を記録し、欠損処理の履歴を残す
よく使うメソッド早見表 #
| 操作 | pandas | 例 |
|---|---|---|
| 行・列抽出 | loc / iloc | df.loc[df["R1"]>30, ["カテゴリ","R1"]] |
| 列の追加 | assign | df.assign(diff=df["R1"]-df["H1"]) |
| 列の一括変換 | filter + apply | df.filter(regex="^H").apply(pd.to_numeric) |
| 集計 | groupby / agg | tidy.groupby("year").agg({"value":"sum"}) |
| 形の変換 | melt / pivot_table | long ↔ wide |
チェックリスト #
-
info()とdescribe()で異常値・欠損・型を把握した - 列名を正規化し、
filter(regex=...)で扱えるようにした -
assign/locを使って可読性の高いフィルタリングを書いた - long 形式 (
melt) を作り、groupby・可視化に使い回せるようにした - 保存時にエンコーディング・フォーマットを明示した
ここで整理した DataFrame は、次ページの agg や SQL 例でそのまま使いまわします。