首页 > 解决方案 > 使用 Python 跟踪累积值

问题描述

我想跨列执行特定计算: pwr - base + final 创建一个“使用”列。但是,这必须按 id 和日期分组。一旦建立了第一个计算,第二个计算将是新创建的已用列的累积。这将是:每个日期行的使用列+最终。

数据

pwr pos id  date    base    position    final   
100 40  aa  q121    50     20           15  
100 40  aa  q221    50     20           25  
100 40  aa  q321    50     20           10  
100 40  aa  q421    50     20           5   
50  30  bb  q121    25     10           0   
50  30  bb  q221    25     10           10  
                            

期望的

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

正在做

df['used'] =  df['pwr'].sub(df.groupby('id')['date'].cumsum()).sub(df.groupby('id')['base'].cumsum()).add(df.groupby('id')['final'].cumsum())

但是,最后一列计算不正确。任何建议表示赞赏。

标签: pythonpandasnumpy

解决方案


我们需要先找到第一项,将所有repeated值设为 NaN ,然后groupby使用cumsum

s = df['pwr'].sub(df['base']).mask(df['id'].duplicated()).add(df['final'],fill_value=0)

df['new'] = s.groupby(df['id']).cumsum()
df
   pwr  pos  id  date  base  position  final    new
0  100   40  aa  q121    50        20     15   65.0
1  100   40  aa  q221    50        20     25   90.0
2  100   40  aa  q321    50        20     10  100.0
3  100   40  aa  q421    50        20      5  105.0
4   50   30  bb  q121    25        10      0   25.0
5   50   30  bb  q221    25        10     10   35.0

推荐阅读