pandas の基本操作

Prep

pandas の基本操作

ここで使うデータは 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 / ilocdf.loc[df["R1"]>30, ["カテゴリ","R1"]]
列の追加assigndf.assign(diff=df["R1"]-df["H1"])
列の一括変換filter + applydf.filter(regex="^H").apply(pd.to_numeric)
集計groupby / aggtidy.groupby("year").agg({"value":"sum"})
形の変換melt / pivot_tablelong ↔ wide

チェックリスト #

  • info()describe() で異常値・欠損・型を把握した
  • 列名を正規化し、filter(regex=...) で扱えるようにした
  • assign / loc を使って可読性の高いフィルタリングを書いた
  • long 形式 (melt) を作り、groupby・可視化に使い回せるようにした
  • 保存時にエンコーディング・フォーマットを明示した

ここで整理した DataFrame は、次ページの agg や SQL 例でそのまま使いまわします。