看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在统计数据数据的报表中,经常会有一些按组的小计,在今天的案例中,我们将分组内的数据按组进行排序,同时保留组内的小计位置不变。我们看看如何用 pandas 来完成这样的一个操作。
注:本例在 pandas 2.2 下通过,同时建议安装 pyarrow 库。
我们的源数据本在 Excel 中,我们来用 DataFrame 构造代码,代码如下:
import pandas as pd
df = pd.DataFrame({
'楼层号': ['F01']* 4 + ['F02']*4,
'产品' : (list('ABC') + ['小计'])*2,
'销售额' : [2,3,1,6,7,9,8,24]
})
df
'''
楼层号 产品 销售额
0 F01 A 2
1 F01 B 3
2 F01 C 1
3 F01 小计 6
4 F02 A 7
5 F02 B 9
6 F02 C 8
7 F02 小计 24
'''
可以看到有 F01 和 F02 两个楼层号的分组,我们需要按照「销售额」在组内进行排序,同时不能改变产品列小计的位置,让它一直在组的最底部。
首先,我们用分组方法按 楼层号 来分组,接着写一个函数来用 apply 应用,用来处理需求中的逻辑。
这个函数我们可以将每个子 DataFrame 依次进行处理,在每个子 DataFrame 中,我们将数据分为两部分:
最后,用拼接的方式,将以上两部分数据拼接一个新的 DataFrame 并返回。
根据思路,我们最终的代码是:
def func(d: pd.DataFrame) -> pd.DataFrame:
df1 = d.query('产品!="小计"').sort_values('销售额', ascending=False)
df2 = d.query('产品=="小计"')
return pd.concat([df1, df2])
(
df.groupby('楼层号', as_index=False, group_keys=False)
.apply(func, include_groups=False)
)
'''
产品 销售额
1 B 3
0 A 2
2 C 1
3 小计 6
5 B 9
6 C 8
4 A 7
7 小计 24
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 16:22:07 标签:pandas python 分组 小计