GroupBy中的熊猫累积总和

时间:2017-10-28 15:08:12

标签: 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

现在我要创建第4列,每个符号按时间序列累积值,但是从每个累积行开始,将分别减去每个符号的第一行值

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行的值吗?

3 个答案:

答案 0 :(得分:2)

groupbycumsum的自定义功能一起使用,并减去iat选择的第一个值:

df['adjustedCumulativeSum']=df.groupby('symbol')['value'].apply(lambda x:x.cumsum()-x.iat[0])
print (df)
   index symbol  value  adjustedCumulativeSum
0  01:00      A     10                      0
1  01:00      B     15                      0
2  01:01      A     15                     15
3  01:01      B     25                     25
4  01:02      A     30                     45
5  01:02      B     45                     70

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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