一覧へ

DataFrame の操作 — フィルタリング、ソート、グループ化

pandas DataFrame で必要なデータを抽出し、ソートし、集計する主要な手法を学びます。

入門
|
9
|
検証済み (2026-07)
DataFrameフィルタリングソートグループ化データ操作
進捗0/17 (0%)

DataFrame の加工 — フィルタリング、ソート、グループ化

このトピックを修了すると

pandas DataFrame で条件に基づいてデータを抽出し、ソートし、グループごとに集計できるようになります。


データの準備

python
import pandas as pd
df = pd.DataFrame({
"名前": ["キム・フン", "イ・ス", "パク・ジン", "チェ・ヨン", "チョン・ミン"],
"部署": ["開発", "マーケティング", "開発", "マーケティング", "開発"],
"年齢": [30, 25, 35, 28, 32],
"年収": [5000, 3500, 6000, 4000, 5500]
})

この 5 行のテーブルで、主要なテクニックをすべて習得できます。


列の選択

python
# 単一の列 — Series を返す
df["名前"]
# 複数の列 — DataFrame を返す
df[["名前", "年収"]]
# 新しい列の追加
df["税引後年収"] = df["年収"] * 0.85
# 列の削除
df = df.drop(columns=["税引後年収"])

角括弧 1 つ (df["名前"]) と二重の角括弧 (df[["名前", "年収"]]) の違いに注意してください。1 つの場合は Series、2 つの場合は DataFrame です。


フィルタリング — 条件に基づいて行を抽出

python
# 単一の条件
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 のフィルタリングでは、必ず &/| を使用します。


ソート

python
# 単一の列に基づいて
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 行で答えることができます。

python
# 基本 — 部署別の平均
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 28

groupby は SQL の GROUP BY と同じ概念です。分割 (split) → 適用 (apply) → 結合 (combine) のパターンで動作します。


実践的なパターン — 総合的な加工

python
# 「開発部署で年収 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 に対応すると考えればよいでしょう。

💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...