2017-10-28 269 views
2

累計總和我有在特定時間與符號時間序列數據和各自的價值。大熊貓在的GroupBy

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

你也可以用shift來忽略第一行,如:'df.groupby('y')['z']。apply(lambda x: 。x.shift(-1).cumsum()移(+1))' – JohnE

回答

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

使用groupby與自定義函數與由iat選擇cumsum和。減去第一值:

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 
+0

這也是正確的 – Tahseen

+0

是的,答案只有一個,可以接受;) – jezrael

+0

應用和改造工作完全一樣。有什麼不同 ? – Tahseen

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