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.

El valor más bajo menos el segundo valor más bajo dentro de un grupo (panda, python, groupby)

Tengo un df en el que puedo obtener la diferencia de tiempo entre el tiempo de vuelta más bajo y el tiempo de vuelta restante dentro del groupby con:

df['diff'] = df['lap_time'] - df.groupby('lap_ref')['lap_time'].transform('min')

DataFrame original:

╔═════════╦═════════╦══════════╦══════╗
║ lap_ref ║ swimmer ║ lap_time  ║ diff ║
╠═════════╬═════════╬══════════╬══════╣
║   151   ║ steve   ║  82.64   ║  0   ║
║   151   ║ timoy   ║  82.77   ║ 0.13 ║
║   151   ║  audi   ║  82.83   ║ 0.19 ║
║   151   ║  gimmi  ║  82.98   ║ 0.34 ║
║   151   ║  pete   ║  83.08   ║ 0.44 ║
║   151   ║  manson ║  83.24   ║  0.6  ║
║   151   ║  fuller ║  83.4    ║ 0.76 ║
║   151   ║   ron   ║  83.56   ║ 0.92 ║
║   151   ║  limin  ║  83.62   ║ 0.98 ║
║   151   ║ octank  ║  83.92   ║ 1.28 ║
║   151   ║  frank  ║  83.94   ║  1.3  ║
║   151   ║  mose   ║  84.15   ║ 1.51 ║
║   151   ║  preta  ║   84.2   ║ 1.56 ║
║   151   ║  landra ║   92.2   ║ 9.56 ║
╚═════════╩═════════╩══════════╩══════╝

Necesito llenar el valor 0 con la diferencia entre el más bajo y el segundo más bajo valor dentro del grupo, sin embargo, no puedo encontrar una solución.

Resultado que intento obtener:

╔═════════╦═════════╦══════════╦══════╗
║ lap_ref ║ swimmer ║ lap_time  ║ diff ║
╠═════════╬═════════╬══════════╬══════╣
║   151   ║ steve   ║  82.64   ║-0.13 ║
║   151   ║ timoy   ║  82.77   ║ 0.13 ║
║   151   ║  audi   ║  82.83   ║ 0.19 ║
║   151   ║  gimmi  ║  82.98   ║ 0.34 ║
║   151   ║  pete   ║  83.08   ║ 0.44 ║
║   151   ║  manson ║  83.24   ║  0.6  ║
║   151   ║  fuller ║  83.4    ║ 0.76 ║
║   151   ║   ron   ║  83.56   ║ 0.92 ║
║   151   ║  limin  ║  83.62   ║ 0.98 ║
║   151   ║ octank  ║  83.92   ║ 1.28 ║
║   151   ║  frank  ║  83.94   ║  1.3  ║
║   151   ║  mose   ║  84.15   ║ 1.51 ║
║   151   ║  preta  ║   84.2   ║ 1.56 ║
║   151   ║  landra ║   92.2   ║ 9.56 ║
╚═════════╩═════════╩══════════╩══════╝
data = {'lap_ref':[151,151,151,151,151,151,151,151,151,151,151,151,151,151],
        'swimmer':['steve','timoy','audi','gimmi','pete','manson','fuller',
                    'ron','limin','octank','frank','mose','preta','landra'],
        'lap_time':[82.64,82.77,82.83,82.98,83.08,83.24,83.4,83.56,83.62,83.92,83.94,84.15,84.2,92.2]}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes modificar el código anterior de la siguiente manera:

    df['diff'] = df.groupby('lap_ref')['lap_time'].apply(lambda x: x - x.nsmallest(2).max())
    

    Explicación:

    • nsmallest(2) obtiene los dos tiempos de vuelta más pequeños dentro de cada grupo, luego .max() selecciona el máximo (el segundo más pequeño).
    • apply aplica la función lambda a cada grupo por separado, restando este valor máximo de la columna lap_time.

    Esto dará el resultado deseado:

        lap_ref swimmer  lap_time  diff
    0       151   steve     82.64 -0.13
    1       151   timoy     82.77  0.13
    2       151    audi     82.83  0.19
    3       151   gimmi     82.98  0.34
    4       151    pete     83.08  0.44
    5       151  manson     83.24  0.60
    6       151  fuller     83.40  0.76
    7       151     ron     83.56  0.92
    8       151   limin     83.62  0.98
    9       151  octank     83.92  1.28
    10      151   frank     83.94  1.30
    11      151    mose     84.15  1.51
    12      151   preta     84.20  1.56
    13      151  landra     92.20  9.56
    

Comments are closed.