看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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 分组