Subconjunto de filas subsecuentes condicionales en una diferencia entre otro valor.
Tengo un conjunto de datos:
df
índice | ID | Fecha | Valor |
---|---|---|---|
76 | 1 | 2020-03-04 | -5 |
77 | 1 | 2020-03-04 | -6.1 |
78 | 1 | 2020-03-04 | -6.5 |
79 | 1 | 2020-03-04 | -6.4 |
80 | 1 | 2020-03-04 | -4 |
81 | 1 | 2020-03-05 | -5 |
82 | 1 | 2020-03-05 | -5.6 |
83 | 1 | 2020-03-05 | -5.5 |
84 | 1 | 2020-03-05 | -5.2 |
101 | 2 | 2020-02-14 | -3 |
101 | 2 | 2020-02-14 | -3.2 |
101 | 2 | 2020-02-14 | -5 |
101 | 2 | 2020-02-14 | -5.1 |
101 | 2 | 2020-02-14 | -5.6 |
Por lo tanto, múltiples IDs, múltiples Fechas y valores.
Quiero devolver el promedio de los valores solamente de aquellas filas consecutivas donde la diferencia entre los valores no fue mayor a 1.
Entonces, mi lógica detrás de esto fue encontrar la columna de diferencia utilizando diff
df[‘diff’] = abs(df.groupby([‘ID’,’Fecha’])[‘Valor’].diff())
Luego, agrego este valor de conteo, donde cuento las filas consecutivas para obtener algo como
Count |
---|
0 |
0 |
1 |
2 |
0 |
0 |
1 |
2 |
3 |
0 |
1 |
0 |
1 |
2 |
Esto lo hago encontrando un True/False si es menor a 1 y luego cumsum sobre eso
df[‘Count’] = df.groupby([‘ID’,’Fecha’])[‘diff’].apply(lambda x : x > 1)
df[‘Count’] = df.groupby([df[‘ID’],df[‘Fecha’],df[‘Count’].cumsum()])[‘Count’].apply(lambda x : (~x).cumsum())
Por alguna razón, creo que entré en tanto detalle que no puedo descifrarlo, y tengo la sensación de que es súper simple.
Idealmente, obtendría un nuevo df con las filas consecutivas más grandes donde la diferencia es menor que esto.
davy.ai
Y luego puedo agrupar por Cantidad y obtener el promedio de los valores.
Esto debería devolver el promedio de los valores solo de aquellas filas consecutivas donde la diferencia entre los valores no fue mayor que 1.