Uso de cumsum en pandas en grupo ()

De un novato de Pandas: tengo datos que se parecen esencialmente a esto:

data1=pd.DataFrame({'Dir':['E','E','W','W','E','W','W','E'], 'Bool':['Y','N','Y','N','Y','N','Y','N'], 'Data':[4,5,6,7,8,9,10,11]}, index=pd.DatetimeIndex(['12/30/2000','12/30/2000','12/30/2000','1/2/2001','1/3/2001','1/3/2001','12/30/2000','12/30/2000'])) data1 Out[1]: Bool Data Dir 2000-12-30 Y 4 E 2000-12-30 N 5 E 2000-12-30 Y 6 W 2001-01-02 N 7 W 2001-01-03 Y 8 E 2001-01-03 N 9 W 2000-12-30 Y 10 W 2000-12-30 N 11 E 

Y quiero agruparlo por varios niveles, luego hacer un cumsum ():

Por ejemplo, como running_sum=data1.groupby(['Bool','Dir']).cumsum() <- (No funciona)

con salida que se vería algo así como:

 Bool Dir Date running_sum NE 2000-12-30 16 W 2001-01-02 7 2001-01-03 16 YE 2000-12-30 4 2001-01-03 12 W 2000-12-30 16 

Mi código “me gusta” claramente no está ni siquiera cerca. Hice varios bashs y aprendí muchas cosas nuevas sobre cómo no hacer esto.

Gracias por cualquier ayuda que usted puede dar.

Prueba esto:

 data2 = data1.reset_index() data3 = data2.set_index(["Bool", "Dir", "index"]) # index is the new column created by reset_index running_sum = data3.groupby(level=[0,1,2]).sum().groupby(level=[0,1]).cumsum() 

La razón por la que no puede usar simplemente cumsum en cumsum tiene que ver con la forma en que se estructuran sus datos. Agrupar por Bool y Dir y aplicar una función de agregación ( sum , mean , etc.) producirá un DataFrame de un tamaño más pequeño del que comenzó, ya que cualquier función que use agregaría valores según las claves de su grupo. Sin embargo, el cumsum no es una función de agregación. Devolverá un DataFrame que es del mismo tamaño que el que se llama con. Por lo tanto, a menos que su DataFrame de entrada esté en un formato en el que la salida pueda tener el mismo tamaño después de llamar a cumsum , generará un error. Por eso llamé a la sum primero, que devuelve un DataFrame en el formato de entrada correcto.

Lo siento si no he explicado esto lo suficientemente bien. Tal vez alguien más podría ayudarme?

Como señala la otra respuesta, está intentando colapsar fechas idénticas en filas individuales, mientras que la función de sum devolverá una serie de la misma longitud que el DataFrame original. Dicho de otra manera, realmente desea agrupar por [Bool, Dir, Fecha], calcular una sum en cada grupo, LUEGO devolver una sum en filas agrupadas por [Bool, Dir]. La otra respuesta es una solución perfectamente válida para su pregunta específica, aquí hay una variación de una sola línea:

 data1.groupby(['Bool', 'Dir', 'Date']).sum().groupby(level=[0, 1]).cumsum() 

Esto devuelve la salida exactamente en el formato solicitado.

Para aquellos que buscan una sum simple en un grupo de Pandas, puede usar:

 data1.groupby(['Bool', 'Dir']).apply(lambda x: x['Data'].cumsum()) 

La sum acumulada se calcula internamente para cada grupo. Así es como se ve la salida:

 Bool Dir NE 2000-12-30 5 2000-12-30 16 W 2001-01-02 7 2001-01-03 16 YE 2000-12-30 4 2001-01-03 12 W 2000-12-30 6 2000-12-30 16 Name: Data, dtype: int64 

Tenga en cuenta las fechas repetidas, pero esto está haciendo una sum acumulativa estricta interna a las filas de cada grupo identificado por las columnas Bool y Dir.