我有一个带符号的时间序列数据及其在特定时间的各自值。
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行的值吗?
答案 0 :(得分:2)
将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
答案 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