如何在Pandas中按产品分组计算往期日期的累计求和?
Pandas实现同产品往期Volumes累计求和
问题描述
我有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'Date': ['2018-04-01', '2018-05-01', '2018-06-01', '2018-07-01', '2018-08-01'], 'Product': ['a', 'a', 'a', 'b', 'b'], 'Volumes': [10,30,40,50,60] })
对应的表格:
| Date | Product | Volumes |
|---|---|---|
| 2018-04-01 | a | 10 |
| 2018-05-01 | a | 30 |
| 2018-06-01 | a | 40 |
| 2018-07-01 | b | 50 |
| 2018-08-01 | b | 60 |
我希望新增一列Result,对同一款产品的所有往期月份(包括当前月份)的Volumes进行求和,期望输出如下:
| Date | Product | Volumes | Result |
|---|---|---|---|
| 2018-04-01 | a | 10 | 10 |
| 2018-05-01 | a | 30 | 40 |
| 2018-06-01 | a | 40 | 80 |
| 2018-07-01 | b | 50 | 50 |
| 2018-08-01 | b | 60 | 110 |
解决方案
这其实是个典型的分组累计求和需求,用Pandas的groupby+cumsum()就能轻松实现:
核心思路
- 按
Product字段分组,确保我们只在同一款产品的范围内计算求和 - 对分组后的
Volumes列使用cumsum()方法,该方法会在每个分组内从第一行开始逐行累计相加,正好对应你需要的“往期(含当前)Volumes总和”
完整代码
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Date': ['2018-04-01', '2018-05-01', '2018-06-01', '2018-07-01', '2018-08-01'], 'Product': ['a', 'a', 'a', 'b', 'b'], 'Volumes': [10,30,40,50,60] }) # 新增Result列:按Product分组后计算累计求和 df['Result'] = df.groupby('Product')['Volumes'].cumsum() # 查看结果 print(df)
补充说明
如果你的原始数据没有按日期顺序排列,建议先按Product和Date排序后再计算,避免累计结果出错:
# 先排序再计算累计求和 df = df.sort_values(by=['Product', 'Date']) df['Result'] = df.groupby('Product')['Volumes'].cumsum()
内容的提问来源于stack exchange,提问作者Amy D
相关产品推荐
相关产品推荐

