まとめ- pandas DataFrameの基本操作(選択・フィルタ・集計・形の変換)を整理する。
loc/ilocによるインデックスアクセス、assignによる列追加、melt/pivot_tableによる long⇔wide 変換。- pandasを使い始める段階で参照するリファレンスとして使う。
ここで使うデータは sample-data で整形した soumu-gdp-clean.csv です。
1
2
3
4
5
6
| from pathlib import Path
import pandas as pd
DATA = Path("../data/processed/soumu-gdp-clean.csv")
df = pd.read_csv(DATA)
df.head()
|
1. メタ情報の確認
#
1
2
| df.info()
df.describe().T[['mean','std','min','max']].round(2).head()
|
info() で列数・行数・欠損を俯瞰describe() を転置し、代表値を一括確認df.columns / df.dtypes で名称と型を列挙
列の正規化
#
1
2
3
4
5
6
| df.columns = (
df.columns
.str.replace("年度", "")
.str.replace("令和", "R")
.str.replace("平", "H")
)
|
略称を統一しておくと filter(regex="^H") などの抽出が楽になります。
2. 行・列選択 (loc / iloc)
#
1
2
| df.loc[df["カテゴリ"] == "社会保障関係費", ["カテゴリ", "H1", "H10", "R1"]]
df.iloc[:3, :5] # 位置ベース
|
loc[条件, 列] で意味ベースの抽出iloc[行番号, 列番号] で位置ベースの抽出
頻出パターンを関数化しておくと便利です。
1
2
3
4
| def pick(category, cols):
return df.loc[df["カテゴリ"] == category, cols]
pick("教育費", ["H1", "H5", "R1"])
|
3. 行フィルタと新列
#
1
2
3
4
5
6
7
8
9
10
| 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)
#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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 を使用します。
1
2
3
4
5
| pivot = tidy.pivot_table(
index="year",
columns="カテゴリ",
values="value"
)
|
5. 書き出しとログ
#
1
2
| 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 |
チェックリスト
#
ここで整理した DataFrame は、次ページの agg や SQL 例でそのまま使いまわします。