一、Pandas 的分组聚合
分组聚合原理:
1、使用 groupby 方法进行分组聚合
分组:
该方法提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组。其常 用参数与使用格式如下
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
groupby 参数说明
参数 | 说明 |
---|---|
by | 接收 list,string,mapping 或者 generator,用于确定进行分组的依据,无默认 |
axis | 接收 int,表示操作的轴向,默认对行进行操作,默认为 0 |
level | 接收 int 或者索引名,代表标签所在级别,默认为 None |
as_index | 接收 boolearn,表示聚合后的聚合标签是否以 DataFrame 索引形式输出,默认 为 True |
sort | 接收 boolearn,表示是否依据分组标签进行排序。默认为 True。 |
group_keys | 接收 boolearn,表示是否显示分组标签的名称。默认为 True |
squeeze | 接收 boolearn,表示是否在允许的情况下对返回数据进行降维,默认为 False |
groupby 方法的参数及其说明——by 参数的特别说明:
如果传入的是一个函数则对索引进行计算并分组
如果传入的是一个字典或者 Series,则字典或者 Series 的值用来做分组依据
如果传入一个 NumPy 数组,则数据的元素作为分组依据
如果传入的是字符串或者字符串列表,则使用这些字符串所代表的字段作为分组依据
聚合:
用 groupby 方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址, 实际上分组后的数据对象 groupby 类似 Series 与 DataFrame,是 pandas 提供的一种对象
groupby 对象常用的描述统计
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
count | 计算分组的数目,包括缺失值 | cumcount | 对每个分组中组员进行 标记,0 至 n-1 |
head | 返回每组的前 n 个值 | size | 返回每组的大小 |
max | 返回每组最大值 | min | 返回每组最小值 |
mean | 返回每组的均值 | std | 返回每组的标准差 |
median | 返回每组的中位数 | sum | 返回每组的和 |
2、使用 agg 函数进行聚合数据
agg 参数理解
agg 方法支持对每个分组应用某函数,包括 Python 内置函数或自定义函数,同时这两 个方法能够也能够直接对 DataFrame 进行函数应用操作
DataFrame.agg(func, axis=0, *args, **kwargs)
agg 参数说明
参数 | 说明 |
---|---|
func | 接收 list、dict、function,表示应用于每行/每列的函数 |
axis | 接收 0 或者 1,代表操作的轴向,默认为 0,表示行的方向 |
2、agg 方法求统计指标
创建学生信息表,使用 agg 方法进行统计指标
学生信息表
cls_id | group_id | name | hight | score | |
---|---|---|---|---|---|
Stu_0 | A | 1 | zs | 170 | 99.0 |
Stu_1 | A | 1 | ls | 172 | 98.0 |
Stu_2 | A | 1 | ww | 185 | 97.5 |
Stu_3 | A | 2 | zl | 190 | 96.0 |
Stu_4 | A | 2 | xx | 173 | 89.0 |
Stu_5 | A | 2 | yy | 156 | 85.0 |
Stu_6 | B | 1 | zz | 162 | 99.0 |
Stu_7 | B | 1 | oo | 165 | 78.0 |
Stu_8 | B | 1 | pp | 189 | 89.0 |
Stu_9 | B | 2 | ii | 178 | 88.0 |
Stu_10 | B | 2 | tt | 175 | 92.0 |
Stu_11 | B | 2 | 176 | 94.0 |
学生信息表数据字段说明
字段名称 | 说明 |
---|---|
cls_id | 班级 ID |
group_id | 小组 ID |
name | 姓名 |
hight | 身高 |
score | 考试成绩 |
代码实现:
import pandas as pd
import numpy as np
# 分组聚合: 先分组,再聚合 --->1、指定如何分组? 2、统计指标?
# 创建df
df = pd.DataFrame(
data={
'cls_id': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
'group_id': [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2],
'name': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'oo'],
'hight': [170, 172.5, 168, 192, 181.5, 156, 154, 162, 180, 179.5, 173, 176.5],
'score': [99, 92, 85, 71, 59, 76.5, 89, 95, 93, 79, 70, 84]
},
index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5', 'stu6', 'stu7', 'stu8', 'stu9', 'stu10', 'stu11']
)
print('df:\n', df)
print('df:\n', type(df))
print('*' * 100)
# 指定分组、指定统计指标
# 可以使用groupby 来指定分组 --by参数 --指定分组的列
# 按照单列分组,统计单列的指标
# 按照班级id进行分组,统计各个班级的平均成绩
res = df.groupby(by='cls_id')['score'].mean()
print('res:\n', res)
# 按照多列进行分组,统计单列指标
# 先按照班级id,再按照小组Id, 进行分组, 统计各个组的平均成绩
res = df.groupby(by=['cls_id', 'group_id'])['score'].mean()
print('res:\n',res)
# 按照单列分组,统计多列的指标
# 按照班级Id进行分组,统计成绩、身高的平均值
res = df.groupby(by='cls_id')[['score','hight']].mean()
print('res:\n',res)
# 按照多列进行分组,统计多列的指标
# 先按照班级id,再按照小组id进行分组,统计各个组内的成绩、身高的最大值
res = df.groupby(by=['cls_id', 'group_id'])[['score', 'hight']].max()
print('res:\n',res)
1、可以使用 agg 方法一次求出 DataFrame 多列的多个统计指标
# agg --->不分组 ---对列求取指标
# 注意:agg = aggregate 同样的
# 1、对多列求取多个指标
# 对score 、hight 求取其均值、最大值、最小值
res = df.loc[:, ['score', 'hight']].agg([np.mean, np.max