看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需要是要实现先按时间分组,按产品类别求和,然后筛选求和后最大值。重点使用 transform
对分组进行操作,完成对数据类似 SQL 的窗口函数的功能。
数据结构如下:
'''
日期 产品 数量
2020/6/1 A 8
2020/6/1 A 7
2020/6/1 A 13
2020/6/1 B 13
2020/6/1 B 13
2020/6/1 D 15
2020/6/2 A 8
2020/6/2 A 2
2020/6/2 B 8
2020/6/2 C 13
2020/6/3 B 9
2020/6/3 B 3
2020/6/3 B 13
2020/6/3 B 6
2020/6/3 C 4
2020/6/3 D 13
2020/6/3 D 12
2020/6/3 D 12
2020/6/3 D 6
'''
该数据是一个每天的生产流水,每天可能会生产不同产品多个批次,需求是得到每天最大数量的那批产品。
解决以上需求首先要对日期和产品进行分组,分组后筛选出所在组最大的数量。在筛选最大数量时我们可以不考虑商品,直接找出每天最大的数量。
transform 可以完成类似 SQL 的窗口计算,把所在同日期最大值赋值给每个行上,再与按日期和产品分组后的数据进行判断得出结果。
还有方法二,直接通过 idxmax()
找到最大值所在行的索引进行判断。
根据思路,解决方案代码如下:
import pandas as pd
df = pd.read_clipboard()
df.head()
'''
日期 产品 数量
0 2020/6/1 A 8
1 2020/6/1 A 7
2 2020/6/1 A 13
3 2020/6/1 B 13
4 2020/6/1 B 13
'''
(
df.groupby(['日期', '产品'])
.sum()
.loc[lambda x: x.数量 == x.groupby('日期').transform(max).数量]
)
'''
数量
日期 产品
2020/6/1 A 28
2020/6/2 C 13
2020/6/3 D 43
'''
# 方法二
(
df.groupby(['日期', '产品'])
.sum()
.loc[lambda x: x.groupby(level=0).idxmax().数量]
)
更新时间:2024-08-18 15:37:53 标签:pandas python 分组