pandas実務(DataFrame変換)

pandasとDataFrame

pandas は [[Python]] で表形式のデータを扱うライブラリです。中心となるのが DataFrame で、行と列を持つ表をそのままオブジェクトとして操作できます。

import pandas as pd

df = pd.read_csv("input.csv")
df = df[df["status"] == "active"]      # 行の絞り込み
df["total"] = df["price"] * df["qty"]  # 列の追加
df.to_excel("output.xlsx", index=False)

繰り返し処理を書かずに、列や条件をまとめて指定する書き方が基本です。1行ずつループを回すより速く、意図も読み取りやすくなります。

JSONと表形式の相互変換

[[JSON]] のような入れ子構造と表形式は形が違うため、変換時に入れ子をどう平らにするかを決める必要があります。

records = [{"id": 1, "user": {"name": "太郎", "age": 30}}]
df = pd.json_normalize(records)   # user.name / user.age という列になる

json_normalize は入れ子のキーを . でつないだ列名へ展開します。逆方向は to_dict(orient="records") で1行を1つの辞書にできます。

変換の向き手段注意点
JSON → 表json_normalize配列を含む項目は行が増えるか、そのまま残る
表 → JSONto_dict(orient="records")欠損値が NaN のまま出るとJSONとして扱いにくい

配列を含む項目は素直に平らになりません。展開して行を増やす(explode)か、文字列としてまとめるかをデータの意味から決めます。ここを機械的に処理すると、意味の違う行が同一視されます。

欠損値と型の落とし穴

実務で時間を取られるのはこの2点です。

  • 欠損値 — 空欄は NaN になります。NaN は自分自身とも等しくならないため、比較演算で拾えません。isna() で判定します
  • 型の推測 — 読み込み時に列の型が自動推測されます。先頭が数字だけのIDが数値になり、先頭の0が消えるのは典型的な事故です。dtype=str を明示して防ぎます
  • 文字コード — [[CSV]] を読むときのエンコーディング指定を誤ると読み込み時点で壊れます([[文字コードと文字化け]])

出力先が [[Excel自動生成]] の場合、見た目の整形はpandasの範囲外です。値の変換までをpandasで行い、体裁は出力側のライブラリに任せると責務が分かれます。

大きなデータを扱うとき

pandas は読み込んだデータをすべてメモリへ載せます。元ファイルのサイズに対して数倍のメモリを使うことがあり、大きなCSVでそのまま落ちることがあります。

  • chunksize を指定して分割して読み込み、部分ごとに処理して結果だけを積み上げる
  • 必要な列だけを usecols で読む(不要な列を読まないだけで大きく減る)
  • 繰り返し使う中間結果はCSVではなく列指向の形式で保存すると、読み込みが速く軽くなる

件数がさらに増えて処理時間が問題になるなら、[[データパイプライン・ETL]] としてバッチの設計そのものを見直す段階です。pandas の書き方を工夫し続けるより、処理の分割単位を変えるほうが効きます。

関連技術とのつながり

  • [[Python]] — 実装言語。データ処理での事実上の標準ライブラリ
  • [[CSV]] — 最も多い入出力形式。区切り文字と文字コードの指定が要点
  • [[Excel自動生成]] — 変換結果の出力先。整形は出力側に任せる
  • [[データパイプライン・ETL]] — 抽出・変換・書き出しの「変換」を担う部品
Q: pandasで欠損値を判定する正しい方法はどれ?
- [ ] 値と `NaN` を等号で比較する
- [x] `isna()` を使う
- [ ] 空文字と比較する
解説: `NaN` は自分自身とも等しくならないため、比較演算では拾えません。`isna()` で判定します。

Q: IDのような列で先頭の0が消える事故を防ぐ方法はどれ?
- [ ] 読み込み後に文字列へ変換する
- [x] 読み込み時に `dtype=str` を指定する
- [ ] 列名を変更する
解説: 型は読み込み時に推測されるため、その時点で数値になると先頭の0は失われます。読み込み時の指定が必要です。

Q: JSONの入れ子を表形式へ変換する関数はどれ?
- [x] `json_normalize`
- [ ] `to_excel`
- [ ] `read_csv`
解説: `json_normalize` は入れ子のキーを `.` でつないだ列名へ展開します。配列を含む項目は別途扱いを決める必要があります。