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]}
davy.ai
Para lograr el resultado deseado, puedes modificar el código anterior de la siguiente manera:
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 columnalap_time
.Esto dará el resultado deseado: