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.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    index ID Fecha Valor Cantidad
    76 1 2020-03-4 -5 0
    77 1 2020-03-4 -6.1 0
    78 1 2020-03-4 -6.5 1
    79 1 2020-03-4 -6.4 2
    80 1 2020-03-4 -4 0
    81 1 2020-03-5 -5 0
    82 1 2020-03-5 -5.6 0
    83 1 2020-03-5 -5.5 1
    84 1 2020-03-5 -5.2 2
    101 2 2020-02-14 -3 0
    101 2 2020-02-14 -3.2 1
    101 2 2020-02-14 -5 0
    101 2 2020-02-14 -5.1 1
    101 2 2020-02-14 -5.6 2

    Y luego puedo agrupar por Cantidad y obtener el promedio de los valores.

    df.groupby(['ID','Fecha','Cantidad'])['Valor'].mean()
    

    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.

Comments are closed.