Python 数据分析与可视化 Day 4 - 分组统计(groupby)与聚合分析(aggregation)

发布于:2025-06-27 ⋅ 阅读:(11) ⋅ 点赞:(0)

🎯 今日目标

  • 掌握 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,完成以下练习:

  1. 按性别统计学生人数

  2. 按性别统计平均成绩、最高分、最低分

  3. 按性别和是否及格双重分组,统计各组平均成绩

  4. 构建透视表,显示是否及格和性别的成绩均值交叉表

  5. 输出平均成绩最高的性别组

    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
    
    👥 每个性别的学生人数:
    女    22
    Name: 性别, dtype: int64
    
    📊 各性别的成绩统计:
            mean   max   min  count
    性别                            
    女      73.5  73.5  73.5      273.5  88.0  59.0      2
    
    📊 按性别和是否及格分组的平均成绩:
    性别  是否及格
    女   False    73.5
        True      73.5False    59.0
        True      88.0
    Name: 成绩, dtype: float64
    
    📊 透视表(性别 × 是否及格 → 平均成绩):
    是否及格     False  True
    性别                    
    女         73.5  73.559.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() 进行自定义多重聚合
  • 学会了构建透视表并进行交叉分析
  • 初步具备了分组维度下的深层次分析能力

题外话

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到