Tengo una serie de datos con símbolo y sus respectivos valores en un momento determinado.

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

Ahora quiero crear una cuarta columna, que tiene un valor acumulativo en base a series de tiempo para cada símbolo, pero de cada fila acumulativa, el valor de la primera fila se restará para cada símbolo respectivamente

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

Sé cómo hacer una suma acumulativa normal.

df = df.reset_index().sort_values(['index','symbol'])
df['cumlativesum'] = df.groupby('symbol')['value'].cumsum()
df = df.set_index('index')

¿Pero deduzco el valor de la fila 0 de todas las sumas acumulativas?

3
Tahseen 28 oct. 2017 a las 18:08

3 respuestas

La mejor respuesta

Puede restar el primer valor (extraído con .iat[0]) para cada grupo en una función 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
Psidom 28 oct. 2017 a las 15:17

Utilice groupby con personalizado funciona con cumsum y reste el primer valor seleccionado por 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
2
jezrael 28 oct. 2017 a las 15:17
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
1
YOBEN_S 28 oct. 2017 a las 15:14