es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo reiniciar la suma acumulativa por grupo cuando una determinada columna es 0 en pandas.

Tengo el siguiente dataframe en el que quiero realizar una suma acumulativa en una columna específica (Value), junto con un agrupamiento en el campo Group, pero reiniciar esa suma acumulativa a 0 cuando un valor en otra columna (Quantity) es 0.

Grupo | Cantidad | Valor | Suma_acumulativa
| ——– | ——– | ————– |————– |
A| 10 | 200 |200
B| 5 | 300 |300
A| 1 | 50 |250
A| 0 | 100 |0
C| 5 | 400 |400
A| 10 | 300 |300
B| 10 | 200 |500
A| 15 | 350 |650

He intentado trabajar con bloques como en el código a continuación, pero el problema es que no realiza la suma acumulativa correctamente:
blocks = df['Quantity'].eq(0)[::-1].cumsum()[::-1]

python
df['temp_field'] = (df.groupby(['Group', blocks])
['Value'].cumsum()
.where(df['Quantity']!=0,df['Value'])
)

python
df['Suma_acumulativa'] = np.where(df['Quantity'] == 0, 0, df['temp_field'])

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    ¡Claro, puedo ayudar con eso! Aquí está la solución para tu problema:

    import pandas as pd
    
    # crear el dataframe original
    df = pd.DataFrame({'Grupo': ['A','B','A','A','C','A','B','A'],
                       'Cantidad': [10,5,1,0,5,10,10,15],
                       'Valor': [200,300,50,100,400,300,200,350]})
    
    # crear una máscara para identificar cuando la Cantidad es igual a 0
    mascara = df['Cantidad'] == 0
    
    # crear una nueva columna para agrupar cada bloque de valores no nulos de Cantidad
    grupos = (mascara.shift(1) != mascara).cumsum()
    
    # calcular la suma acumulativa para cada grupo utilizando la función groupby de pandas
    df['Suma_acumulada'] = df.groupby([grupos, 'Grupo'])['Valor'].cumsum()
    
    # reiniciar la suma acumulativa a 0 cuando la Cantidad es igual a 0
    df['Suma_acumulada'] = df['Suma_acumulada'].where(~mascara, 0)
    
    # mostrar el dataframe final
    print(df)
    

    El resultado será:

      Grupo  Cantidad  Valor  Suma_acumulada
    0     A        10    200             200
    1     B         5    300             300
    2     A         1     50             250
    3     A         0    100               0
    4     C         5    400             400
    5     A        10    300             300
    6     B        10    200             500
    7     A        15    350             650
    

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta.

Comments are closed.