Pandas中的GroupBy累计求和

4
我有一组时间序列数据,包含了某个特定时间点上的符号和它们对应的值。
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行的值?

你也可以使用 shift 来忽略第一行,例如:df.groupby('y')['z'].apply( lambda x: x.shift(-1).cumsum().shift(+1) ) - JohnE
3个回答

3

使用groupby与自定义函数,结合cumsum和通过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

应用和转换的作用完全相同。它们之间有什么区别? - Tahseen
这里的工作方式相同,因为cumcum返回与DataFrame相同大小的系列以进行应用和转换。如果使用了一些聚合函数(如sum)与groupby一起使用,则使用transform - applyagg返回聚合输出,而transform则不会。最好看一个例子 - 在这里查看。 - jezrael

2

transform 函数中,您可以减去每个组中提取的第一个值(使用 .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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接