Python 分组中的累积总和

Python 分组中的累积总和,python,pandas,Python,Pandas,我有一个带有符号的时间序列数据,以及它们在特定时间的各自值 index,symbol,value 01:00,A,10 01:00,B,15 01:01,A,15 01:01,B,25 01:02,A,30 01:02,B,45 现在我想创建一个第四列,它在时间序列的基础上为每个符号提供累积值,但是从每个累积行中,将分别为每个符号减去第一行值 index,symbol,value,adjustedCumulativeSum 01:00,A,10,0 01:00,B,15,0 01:01,A,1

我有一个带有符号的时间序列数据,以及它们在特定时间的各自值

index,symbol,value
01:00,A,10
01:00,B,15
01:01,A,15
01:01,B,25
01:02,A,30
01:02,B,45
现在我想创建一个第四列,它在时间序列的基础上为每个符号提供累积值,但是从每个累积行中,将分别为每个符号减去第一行值

index,symbol,value,adjustedCumulativeSum
01:00,A,10,0
01:00,B,15,0
01:01,A,15,15
01:01,B,25,25
01:02,A,30,45
01:02,B,45,70
我知道如何做正常的累计和

df = df.reset_index().sort_values(['index','symbol'])
df['cumlativesum'] = df.groupby('symbol')['value'].cumsum()
df = df.set_index('index')
但我是否要从所有累计金额中扣除第0行的值

与自定义函数一起使用,并将第一个值减去:


您可以在
转换
函数中为每组减去第一个值(用
.iat[0]
提取):

df['cumlativesum'] = df.groupby('symbol')['value'].transform(lambda g: g.cumsum()-g.iat[0])
df = df.set_index('index')

df
#      symbol   value   cumlativesum
#index          
#01:00      A      10          0
#01:00      B      15          0
#01:01      A      15         15
#01:01      B      25         25
#01:02      A      30         45
#01:02      B      45         70

应用和转换工作完全相同。区别是什么?它在这里的工作原理是相同的,因为应用和转换的
cumcum
返回序列的大小与
DataFrame
相同<如果将某些聚合函数(如
sum
与groupby-
apply
agg
一起使用,则使用code>Transform返回聚合输出,而
Transform
不返回。更好的是参见示例-参见。您还可以使用shift忽略第一行,类似于:
df.groupby('y')['z'].apply(lambda x:x.shift(-1).cumsum().shift(+1))
df['cumlativesum'] = df.groupby('symbol')['value'].transform(lambda g: g.cumsum()-g.iat[0])
df = df.set_index('index')

df
#      symbol   value   cumlativesum
#index          
#01:00      A      10          0
#01:00      B      15          0
#01:01      A      15         15
#01:01      B      25         25
#01:02      A      30         45
#01:02      B      45         70
df.groupby('sy').val.apply(lambda x : x.cumsum()-x.values.tolist()[0])
Out[907]: 
0     0
1     0
2    15
3    25
4    45
5    70
Name: val, dtype: int64