查看全课大纲(第 54 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

分组与聚合介绍

约 6 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析中,我们常常需要按照某个类别或条件将数据分成不同的组,然后对每个组进行统计分析,例如计算各组的平均值、总和或数量。这正是分组与聚合操作的核心应用场景。本节将介绍如何使用pandas的groupby方法,高效地完成“拆分-应用-合并”这一经典数据处理流程,并理解聚合操作的本质。

💡 核心导读

  • 分组(Grouping):根据一个或多个键(类别)将数据集拆分成多个子集。
  • 聚合(Aggregation):对每个分组应用一个函数,将数组(一组值)转换为一个标量(如平均值、总和)。
  • “拆分-应用-合并”(Split-Apply-Combine):groupby操作背后的标准流程,理解它有助于掌握分组聚合的原理。
  • pandas实现:使用DataFrame.groupby()方法进行分组,配合.mean()、.sum()、.count()等聚合函数进行计算。

分组与聚合的概念

在数据分析中,我们经常遇到这样的需求:数据集中包含类别信息,我们需要分别查看每个类别的统计特征。例如,一个销售数据表中有“产品类别”和“销售额”两列,我们希望知道每个产品类别的总销售额或平均销售额。

分组(Grouping) 就是根据某个或某几个类别列,将数据集拆分成多个独立的子集。聚合(Aggregation) 则是对每个分组子集应用一个计算规则(如求和、求平均),将一组数据(数组)汇总为一个单一的标量值。

pandas库提供了强大的groupby方法,能够非常方便地实现这一系列操作。其背后的标准流程被称为 “拆分-应用-合并”(Split-Apply-Combine)。

“拆分-应用-合并”流程详解

groupby操作可以分解为三个清晰的步骤,理解它们有助于我们更好地掌握分组聚合的原理。

1. 拆分(Split)

根据指定的一个或多个列(键)的值,将原始的DataFrame拆分成若干个独立的组(Group)。每个组包含所有键值相同的行。

2. 应用(Apply)

对拆分后的每一个组,独立地应用一个计算函数。这个函数可以是求和(sum)、求平均值(mean)、计数(count)等,也可以是自定义的复杂函数。

3. 合并(Combine)

将每个组应用函数后得到的计算结果,按照分组键重新组合成一个新的数据结构(通常是Series或DataFrame)并返回。

这个过程如下图所示(用文本示意):

原始数据 (DataFrame):
   类别  数值
0   A    1
1   B    3
2   A    2
3   C    2
4   B    1
5   C    2

拆分 (Split by ‘类别’):
组A: [数值: 1, 2]
组B: [数值: 3, 1]
组C: [数值: 2, 2]

应用 (Apply mean()):
组A: (1+2)/2 = 1.5
组B: (3+1)/2 = 2.0
组C: (2+2)/2 = 2.0

合并 (Combine):
类别
A    1.5
B    2.0
C    2.0
Name: 数值, dtype: float64

需要注意的是,在实际使用pandas时,我们无需手动执行这三步。DataFrame.groupby()方法会内部完成整个过程,我们只需要调用它并指定聚合函数即可。

使用pandas进行分组聚合

下面我们通过一个具体的例子,演示如何使用pandas完成分组与聚合操作。假设我们有一个包含班级和分数的小型数据集。

import pandas as pd

# 在代码块内构造示例数据
data = {
    '班级': ['A班', 'B班', 'A班', 'C班', 'B班', 'C班'],
    '分数': [85, 92, 78, 88, 95, 82]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print()

# 使用 groupby 计算每个班级的平均分
grouped = df.groupby('班级') # 拆分:按‘班级’分组
result = grouped['分数'].mean() # 应用与合并:对‘分数’列求均值
print("每个班级的平均分:")
print(result)
print(f"结果类型:{type(result).__name__}")
原始数据:
   班级  分数
0  A班  85
1  B班  92
2  A班  78
3  C班  88
4  B班  95
5  C班  82

每个班级的平均分:
班级
A班    81.5
B班    93.5
C班    85.0
Name: 分数, dtype: float64
结果类型:Series

代码解析:

  1. df.groupby(‘班级’):执行拆分操作,生成一个DataFrameGroupBy对象。此时数据已按‘班级’分成了A班、B班、C班三个组。
  2. grouped[‘分数’].mean():先选中‘分数’列,然后对每个分组应用mean()函数进行应用(求平均),最后将结果合并成一个新的Series。
  3. 最终结果是一个Series,索引是分组键(班级),值是对应班级的平均分。

常用的聚合函数

pandas提供了丰富的内置聚合函数,可以直接在GroupBy对象上调用。以下是一些最常用的函数:

import pandas as pd

# 构造新的示例数据,包含多个数值列
data = {
    '部门': ['销售', '技术', '销售', '技术', '行政', '行政'],
    '销售额': [200, 150, 300, 250, 100, 120],
    '成本': [80, 90, 120, 110, 40, 50]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("\n按‘部门’分组后的多种聚合统计:")

# 同时计算多个聚合指标
agg_result = df.groupby('部门').agg({
    '销售额': ['sum', 'mean', 'max'], # 对销售额求和、平均、求最大值
    '成本': 'sum' # 对成本求和
})
print(agg_result)
原始数据:
   部门  销售额   成本
0  销售  200   80
1  技术  150   90
2  销售  300  120
3  技术  250  110
4  行政  100   40
5  行政  120   50

按‘部门’分组后的多种聚合统计:
    销售额               成本
    sum   mean  max  sum
部门
技术  400  200.0  250  200
行政  220  110.0  120   90
销售  500  250.0  300  200

除了在agg函数中指定,也可以分别调用:

  • sum():求和
  • mean():求平均值
  • count():计数(非空值个数)
  • size():计算每组大小(包含空值)
  • max() / min():求最大值/最小值
  • std() / var():求标准差/方差

聚合操作的本质,正如讲师在视频中所说,是“数组产生标量的过程”。每个分组内的数据(如销售部的销售额[200, 300])经过聚合函数(如sum)的处理,产生了一个单一的标量结果(500)。

📝 动手练一练

  1. 概念辨析:在“拆分-应用-合并”流程中,“应用”(Apply)步骤可以执行哪些类型的操作?除了求平均值、求和,你还能想到什么?

    👉 点击查看参考答案

    “应用”步骤可以执行任何能够处理一个数据子集(即一个分组)并返回一个结果的函数。除了常见的统计聚合(mean, sum, count, max, min, std, var),还可以包括:

    • 数据转换:如对组内数据标准化(lambda x: (x - x.mean()) / x.std())。
    • 筛选:如返回组内销售额超过阈值的所有行(filter)。
    • 自定义函数:任何用户定义的、能接收Series或DataFrame并返回一个标量或Series的函数。 核心是函数作用于单个分组并产生输出。
  2. 动手实践:使用下面提供的数据,计算每个产品ID对应的订单数量(即行数)和销售总额。

    import pandas as pd
    # 请在此代码框架内完成练习
    data = {
        '产品ID': ['P001', 'P002', 'P001', 'P003', 'P002', 'P001'],
        '销售额': [100, 150, 200, 80, 120, 90]
    }
    df = pd.DataFrame(data)
    # 你的代码 here
    👉 点击查看参考答案
    import pandas as pd
    
    data = {
        '产品ID': ['P001', 'P002', 'P001', 'P003', 'P002', 'P001'],
        '销售额': [100, 150, 200, 80, 120, 90]
    }
    df = pd.DataFrame(data)
    
    # 计算每个产品的订单数量(行数)和销售总额
    result = df.groupby('产品ID').agg(
        订单数量=('销售额', 'count'), # 对‘销售额’列计数,统计订单数
        销售总额=('销售额', 'sum')   # 对‘销售额’列求和
    ).reset_index() # 将‘产品ID’从索引变回列,使结果更直观
    
    print(result)

    运行结果应为:

产品ID  订单数量  销售总额
0  P001     3   390
1  P002     2   270
2  P003     1    80
</details>

本章小结

本节我们深入学习了数据分析中至关重要的分组与聚合操作。我们了解到,分组是将数据按类别拆解的过程,而聚合则是将每个分组的数据汇总为单一统计量的过程。pandas通过groupby方法及其背后的“拆分-应用-合并”范式,为我们提供了高效、简洁的工具来完成此类任务。

📋 行动清单

  • 理解核心流程:回顾“拆分-应用-合并”三步,确保能用自己的话解释清楚。
  • 掌握基础语法:熟练使用df.groupby(列名)[列名].聚合函数()的基本形式进行计算。
  • 尝试多元聚合:使用.agg()函数,对分组后的数据一次性计算多个统计指标。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:分组与聚合介绍
    PDF · 207KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载