使用Python实现按id分组的自定义列尾端累积计算问题求助
Pandas DataFrame 分组累积计算列修正方案
原有代码问题
- 错误地对字符串类型的
date字段调用cumsum方法,本身就会返回非预期结果甚至报错 - 逻辑完全不符合需求:不需要对
base、pwr做累积求和,同一id分组下的pwr和base都是固定值,仅需要取一次差值再叠加final的分组累积和即可
前提说明
计算前需要先按id和date升序排序,保证累积计算的顺序和业务规则一致。
正确实现代码
高效向量化实现(适配同id下pwr、base固定的场景)
# 先排序保证日期顺序正确 df = df.sort_values(['id', 'date']).reset_index(drop=True) # 直接计算used列 df['used'] = (df['pwr'] - df['base']) + df.groupby('id')['final'].cumsum()
通用适配实现(兼容同id下pwr、base变化的场景)
def calc_used(group): # 取分组首行计算初始值 init_val = group['pwr'].iloc[0] - group['base'].iloc[0] # 叠加final的累积和得到used列 group['used'] = init_val + group['final'].cumsum() return group df = df.sort_values(['id', 'date']).reset_index(drop=True) df = df.groupby('id', group_keys=False).apply(calc_used)
运行结果验证
运行后输出结果和需求完全匹配:
| pwr | pos | id | date | base | position | final | used |
|---|---|---|---|---|---|---|---|
| 100 | 40 | aa | q121 | 50 | 20 | 15 | 65 |
| 100 | 40 | aa | q221 | 50 | 20 | 25 | 90 |
| 100 | 40 | aa | q321 | 50 | 20 | 10 | 100 |
| 100 | 40 | aa | q421 | 50 | 20 | 5 | 105 |
| 50 | 30 | bb | q121 | 25 | 10 | 0 | 25 |
| 50 | 30 | bb | q221 | 25 | 10 | 10 | 35 |
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

