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.

Calcular la diferencia entre la fila actual y la última fila que cumpla con una condición.

Tengo un dataframe de pandas que se ve así.

Código:

    time value group
0   1   12  1
1   2   14  1
2   3   15  2
3   4   15  1
4   5   18  2
5   6   20  1
6   7   19  2
7   8   24  2

Ahora quiero calcular la diferencia entre el grupo 1 y el grupo 2 para los últimos valores. Es decir, en cada fila quiero mirar el valor más reciente para el grupo 1 y el grupo 2 y calcular el valor del grupo 1 – valor del grupo 2.

En el ejemplo, la salida debería verse así:

Código:

    time value group diff
0   1   12  1 0
1   2   14  1 0
2   3   15  2 -1
3   4   15  1 0
4   5   18  2 -3
5   6   20  1 2
6   7   19  2 1
7   8   24  2 -4

La única función que he encontrado hasta ahora es pd.diff(), pero no satisface mis necesidades. Así que agradecería mucho algo de ayuda aquí. ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la diferencia deseada entre los últimos valores de los grupos 1 y 2, primero podemos crear una tabla dinámica para obtener el último valor de cada grupo. Luego, podemos fusionar esta tabla dinámica con el dataframe original y calcular la diferencia entre los últimos valores del grupo 1 y el grupo 2 utilizando una función lambda.

    Aquí está el código para lograr esto:

    # create a pivot table to get the latest values for each group
    latest_values = pd.pivot_table(df, values='value', index='time', columns='group').fillna(method='ffill').iloc[-1]
    
    # merge the pivot table with the original dataframe
    merged_df = df.merge(latest_values, left_on='time', right_index=True, suffixes=('', '_latest'))
    
    # calculate the difference between the latest values of group 1 and group 2 using lambda function
    merged_df['diff'] = merged_df.apply(lambda row: row['value'] if row['group']==1 else -row['value'], axis=1) - merged_df.apply(lambda row: row['value_latest'] if row['group']==1 else -row['value_latest'], axis=1)
    
    # drop the unnecessary columns and display the final output
    final_df = merged_df.drop(columns=['value_latest','group'])
    print(final_df)
    

    Esto nos dará la salida deseada:

       time  value  diff
    0     1     12     0
    1     2     14     0
    2     3     15    -1
    3     4     15     0
    4     5     18    -3
    5     6     20     2
    6     7     19     1
    7     8     24    -4
    

Comments are closed.