🎯 今日目標
- 掌握 Pandas 中
groupby()
的使用方式 - 學會使用
agg()
方法進行多個聚合 - 掌握
pivot_table()
構建透視表 - 結合分組與排序進行更深入的分析
🧮 一、基本分組統計(groupby)
? 分組 + 單列聚合
df.groupby("性別")["成績"].mean()
輸出(示例):
性別
女 75.2
男 72.3
? 分組 + 多列聚合
df.groupby("性別")[["成績", "是否及格"]].mean()
🔧 二、自定義聚合(agg)
? 一個字段多個聚合函數
df.groupby("性別")["成績"].agg(["mean", "max", "min", "count"])
? 多字段多個聚合函數
df.groupby("性別").agg({"成績": ["mean", "std"],"是否及格": "sum"
})
📊 三、透視表(pivot_table)
pd.pivot_table(df, values="成績", index="性別", columns="是否及格", aggfunc="mean")
可以理解為 Excel 中的“數據透視表”
🔁 四、結合分組后的排序
grouped = df.groupby("性別")["成績"].mean().reset_index()
grouped.sort_values("成績", ascending=False)
🧪 今日練習任務
繼續使用 students_cleaned.csv
,完成以下練習:
-
按性別統計學生人數
-
按性別統計平均成績、最高分、最低分
-
按性別和是否及格雙重分組,統計各組平均成績
-
構建透視表,顯示是否及格和性別的成績均值交叉表
-
輸出平均成績最高的性別組
import pandas as pd import os# 路徑設置 input_path = "data/students_cleaned.csv"if not os.path.exists(input_path):raise FileNotFoundError("? 找不到文件:data/students_cleaned.csv,請先運行清洗腳本。")# 加載數據 df = pd.read_csv(input_path) print("? 已加載清洗后的學生數據:") print(df.head())# 1. 按性別統計人數 print("\n👥 每個性別的學生人數:") print(df["性別"].value_counts())# 2. 按性別統計平均成績、最高分、最低分 print("\n📊 各性別的成績統計:") gender_stats = df.groupby("性別")["成績"].agg(["mean", "max", "min", "count"]) print(gender_stats)# 3. 按性別 & 是否及格 進行雙重分組統計平均成績 print("\n📊 按性別和是否及格分組的平均成績:") multi_group = df.groupby(["性別", "是否及格"])["成績"].mean() print(multi_group)# 4. 構建透視表:性別 vs 是否及格 print("\n📊 透視表(性別 × 是否及格 → 平均成績):") pivot = pd.pivot_table(df, values="成績", index="性別", columns="是否及格", aggfunc="mean") print(pivot)# 5. 平均成績最高的性別組 print("\n🏆 平均成績最高的性別:") top_group = gender_stats["mean"].idxmax() top_score = gender_stats["mean"].max() print(f"{top_group}(平均成績:{top_score:.2f})")# 6. (可選)保存統計結果 output_path = "data/gender_group_stats.csv" gender_stats.to_csv(output_path, encoding="utf-8") print(f"\n? 性別分組統計結果已保存到 {output_path}")
輸出示例:
? 已加載清洗后的學生數據:姓名 性別 成績 是否及格 0 張三 男 88.0 True 1 李四 女 73.5 True 2 王五 男 59.0 False 3 田七 女 73.5 False👥 每個性別的學生人數: 女 2 男 2 Name: 性別, dtype: int64📊 各性別的成績統計:mean max min count 性別 女 73.5 73.5 73.5 2 男 73.5 88.0 59.0 2📊 按性別和是否及格分組的平均成績: 性別 是否及格 女 False 73.5True 73.5 男 False 59.0True 88.0 Name: 成績, dtype: float64📊 透視表(性別 × 是否及格 → 平均成績): 是否及格 False True 性別 女 73.5 73.5 男 59.0 88.0🏆 平均成績最高的性別: 女(平均成績:73.50)? 性別分組統計結果已保存到 data/gender_group_stats.csv
gender_group_stats.csv
📌 補充知識點
groupby()
默認返回的是“分組后對象”,需要用聚合函數.mean()
、.sum()
、.agg()
等觸發計算- 你可以使用
.reset_index()
將 groupby 的結果還原為 DataFrame 格式,便于后續排序、可視化等
?? 今日總結
- 理解并掌握了 Pandas 中
groupby
的用法 - 學會了使用
agg()
進行自定義多重聚合 - 學會了構建透視表并進行交叉分析
- 初步具備了分組維度下的深層次分析能力