DataFrame の加工 — フィルタリング、ソート、グループ化
このトピックを修了すると
pandas DataFrame で条件に基づいてデータを抽出し、ソートし、グループごとに集計できるようになります。
データの準備
import pandas as pd
df = pd.DataFrame({ "名前": ["キム・フン", "イ・ス", "パク・ジン", "チェ・ヨン", "チョン・ミン"], "部署": ["開発", "マーケティング", "開発", "マーケティング", "開発"], "年齢": [30, 25, 35, 28, 32], "年収": [5000, 3500, 6000, 4000, 5500]})この 5 行のテーブルで、主要なテクニックをすべて習得できます。
列の選択
# 単一の列 — Series を返すdf["名前"]
# 複数の列 — DataFrame を返すdf[["名前", "年収"]]
# 新しい列の追加df["税引後年収"] = df["年収"] * 0.85
# 列の削除df = df.drop(columns=["税引後年収"])角括弧 1 つ (df["名前"]) と二重の角括弧 (df[["名前", "年収"]]) の違いに注意してください。1 つの場合は Series、2 つの場合は DataFrame です。
フィルタリング — 条件に基づいて行を抽出
# 単一の条件df[df["年齢"] >= 30]# 名前 部署 年齢 年収# 0 キム・フン 開発 30 5000# 2 パク・ジン 開発 35 6000# 4 チョン・ミン 開発 32 5500
# 複合条件 — & (AND), | (OR)df[(df["部署"] == "開発") & (df["年収"] >= 5500)]# 名前 部署 年齢 年収# 2 パク・ジン 開発 35 6000# 4 チョン・ミン 開発 32 5500
# 文字列の包含検索df[df["名前"].str.contains("キム")]
# 値のリストのいずれかに該当df[df["部署"].isin(["開発", "企画"])]条件を () で囲み、& または | で連結します。Python の and/or とは異なります。DataFrame のフィルタリングでは、必ず &/| を使用します。
ソート
# 単一の列に基づいてdf.sort_values("年収") # 昇順 (小さい→大きい)df.sort_values("年収", ascending=False) # 降順
# 複数の列に基づいてdf.sort_values(["部署", "年収"], ascending=[True, False])# 部署を昇順 → 同じ部署内で年収を降順
# インデックスのリセット (ソート後にインデックスが入れ替わるため)df_sorted = df.sort_values("年収").reset_index(drop=True)reset_index(drop=True) を入れないと、元のインデックスがそのまま残って、0, 3, 1, 4, 2 のような順序になります。
グループ集計 — groupby
データ分析における最も強力なツールです。「部署別の平均年収は?」のような質問に、1 行で答えることができます。
# 基本 — 部署別の平均df.groupby("部署")["年収"].mean()# 開発 5500.0# マーケティング 3750.0
# 複数の集計関数df.groupby("部署")["年収"].agg(["mean", "min", "max", "count"])# mean min max count# 開発 5500 5000 6000 3# マーケティング 3750 3500 4000 2
# 複数の列を集計df.groupby("部署").agg({ "年収": "mean", "年齢": "max"})# 年収 年齢# 開発 5500 35# マーケティング 3750 28groupby は SQL の GROUP BY と同じ概念です。分割 (split) → 適用 (apply) → 結合 (combine) のパターンで動作します。
実践的なパターン — 総合的な加工
# 「開発部署で年収 5000 以上の人を年収の降順で」result = ( df[df["部署"] == "開発"] .query("年収 >= 5000") .sort_values("年収", ascending=False) .reset_index(drop=True))
# 部署別の人数と平均年収を一度にsummary = ( df.groupby("部署") .agg( イン원수=("名前", "count"), 平均年収=("年収", "mean"), 最高年収=("年収", "max") ) .sort_values("平均年収", ascending=False)).query() は、条件を文字列で記述する方法です。複雑な条件の場合、df[(df["a"] > 1) & (df["b"] < 5)] よりも可読性が高くなります。
よく使うメソッドのまとめ
| 作業 | メソッド | 例 |
|---|---|---|
| 条件フィルタリング | df[条件] | df[df["年齢"] > 30] |
| 列の選択 | df[["a", "b"]] | df[["名前", "年収"]] |
| ソート | sort_values() | df.sort_values("年収") |
| グループ集計 | groupby().agg() | df.groupby("部署")["年収"].mean() |
| 上位 N 件 | nlargest() / nsmallest() | df.nlargest(3, "年収") |
| 一意の値 | unique() / nunique() | df["部署"].nunique() |
| 値の分布 | value_counts() | df["部署"].value_counts() |
主要なまとめ
DataFrame の加工は、「何を見たいかをコードで表現するプロセス」です。フィルタリング (どの行?)、ソート (どの順序?)、グループ (どのような基準でまとめて?)、集計 (何を計算?) — この 4 つの動詞だけで、ほとんどのデータに関する質問に答えることができます。SQL を知っている場合は、SELECT ... WHERE ... GROUP BY ... ORDER BY と 1 対 1 に対応すると考えればよいでしょう。