如何使用Pandas GroupBy为每个产品标记销量最高的行
如何使用Pandas GroupBy为每个产品标记销量最高的行
你完全可以用Pandas的groupby配合transform方法来实现这个需求,不用写循环,代码简洁还高效!
先确认下你的原始数据结构:
| product_id | week_number | sales |
|---|---|---|
| A1 | 1 | 1000 |
| A1 | 2 | 2000 |
| A1 | 3 | 3000 |
| A2 | 1 | 8000 |
| A2 | 2 | 4000 |
| A2 | 3 | 2000 |
你的目标是添加一列product_max,标记每个产品销量最高的行,最终效果如下:
| product_id | week_number | sales | product_max |
|---|---|---|---|
| A1 | 1 | 1000 | False |
| A1 | 2 | 2000 | False |
| A1 | 3 | 3000 | True |
| A2 | 1 | 8000 | True |
| A2 | 2 | 4000 | False |
| A2 | 3 | 2000 | False |
具体实现代码
假设你的DataFrame变量名为df,只需要几行代码就能搞定:
import pandas as pd # (如果已经有现成的df可以跳过这段数据构造代码) data = { 'product_id': ['A1', 'A1', 'A1', 'A2', 'A2', 'A2'], 'week_number': [1, 2, 3, 1, 2, 3], 'sales': [1000, 2000, 3000, 8000, 4000, 2000] } df = pd.DataFrame(data) # 核心代码:添加product_max标记列 df['product_max'] = df['sales'] == df.groupby('product_id')['sales'].transform('max')
代码解释
df.groupby('product_id')['sales'].transform('max'):按product_id分组后,计算每个产品组的销量最大值,再通过transform把这个最大值“广播”到组内的每一行,生成一个和原DataFrame长度一致的Series。这样每一行都能对应到自己所属产品的最高销量。- 用原
sales列和这个Series做相等比较,就得到了每行是否是该产品销量最高的标记,结果是布尔值(True/False),正好符合你需要的product_max列的要求。
另外,如果某个产品有多个行销量并列最高(比如同一产品两周销量都是峰值),这个方法也会自动把这些行都标记为True,实用性拉满!
备注:内容来源于stack exchange,提问作者Tyler Moore
相关产品推荐
相关产品推荐

