Python 数据分析与可视化 Day 4 - Pandas 数据筛选与排序操作
🎯 今日目标
- 掌握 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()
进行自定义多重聚合 - 学会了构建透视表并进行交叉分析
- 初步具备了分组维度下的深层次分析能力