看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例不同于常规的分组后直接聚合计算,而是分组后,计算结果时不计算此组所有的值,只计算指定分类的值。让我们先了解一下需求。
数据如下:
df = pd.DataFrame({
'商家编号': [*'123123'],
'收入类型': [*'AAABBB'],
'类型指标': range(1,7),
'收入金额': range(10, 61, 10)
})
df
'''
商家编号 收入类型 类型指标 收入金额
0 1 A 1 10
1 2 A 2 20
2 3 A 3 30
3 1 B 4 40
4 2 B 5 50
5 3 B 6 60
'''
我们要计算的结果是按商家编号进行分组,然后分别得到以下列:
在需求中,除了最后一个值不筛选组内的数据,其他均需要在组中筛选数据再聚合计算。我们通过计算逻辑发现,它们求的都是均值,同时有收入类型和后两列的区别,这样就可以写一个通用的函数来实现,通过传入收入金额和计算列名进行计算。
收入金额总和我们可以单独分组计算来指定。
先进行测试,编写一个收入类型为 A,取类型指标列的计算方法:
# 单列数据计算
(
df.groupby('商家编号')
.apply(lambda d: d.loc[d.收入类型=='A','类型指标'].mean())
)
'''
商家编号
1 1.0
2 2.0
3 3.0
dtype: float64
'''
验证写法没问题后将它封装一个函数,为了方便直接用匿名函数:
# 单列数据计算 定义为一个函数
get_data = lambda typ, idx: (
df.groupby('商家编号')
.apply(lambda d: d.loc[d.收入类型==typ, idx].mean())
)
调用,并指定其他计算列,最后再指定一个收入金额的总体和:
# 应用函数
(
get_data('A', '类型指标')
.to_frame('A1')
.assign(A2=get_data('A', '收入金额'))
.assign(B1=get_data('B', '类型指标'))
.assign(B2=get_data('B', '收入金额'))
.assign(total=df.groupby('商家编号').收入金额.sum())
)
'''
A1 A2 B1 B2 total
商家编号
1 1.0 10.0 4.0 40.0 50
2 2.0 20.0 5.0 50.0 70
3 3.0 30.0 6.0 60.0 90
'''
这样,我们就完成了需求。
(完)
更新时间:2024-08-18 15:56:02 标签:pandas python 分组 统计