Python cumsum incrementa cada vez que se encuentra un nuevo valor

Viniendo de R, el código sería

x <- data.frame(vals = c(100,100,100,100,100,100,200,200,200,200,200,200,200,300,300,300,300,300)) x$state <- cumsum(c(1, diff(x$vals) != 0)) 

Lo que marca cada vez que la diferencia entre filas es distinta de cero, por lo que puedo usarla para detectar transiciones en los datos, de este modo:

  vals state 1 100 1 ... 7 200 2 ... 14 300 3 

¿Cuál sería un equivalente limpio en Python?

Pregunta adicional

La respuesta a la pregunta original se publica a continuación, pero no funcionará correctamente para un dataframe agrupado con pandas.

Datos aquí: https://pastebin.com/gEmPHAb7 . Tenga en cuenta que hay 2 nombres de archivo diferentes.

Cuando se importa como df_all lo df_all con lo siguiente y luego aplico la solución publicada a continuación.

 df_grouped = df_all.groupby("filename") df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum() 

Usando diff y cumsum , como en tu ejemplo de R :

 df['state'] = (df['vals'].diff()!= 0).cumsum() 

Esto usa el hecho de que True tiene un valor entero 1

Pregunta extra

 df_grouped = df_all.groupby("filename") df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum() 

Creo que no entiendes lo que hace groupby . Todo lo que groupby hace es crear grupos basados ​​en el criterio ( filename de filename en esta instancia). Luego debe agregar otra operación para indicar qué debe suceder con este grupo. Las operaciones comunes son mean , sum o más avanzadas según se apply y se transform . Puedes encontrar más información aquí o aquí.

Si puede explicar más detalladamente qué quiere lograr con el grupo, puedo ayudarlo a encontrar el método correcto. Si desea realizar la operación anterior por nombre de archivo, probablemente necesite algo como esto:

 def get_state(group): return (group.diff()!= 0).cumsum() df_all['state'] = df_all.groupby('filename')['Fit'].transform(get_state)