Tengo el siguiente marco de datos: df

                     name  width  length
timestamp                           
2019-08-01 00:00:08    10   10.0     NaN
2019-08-01 00:00:19    10    NaN     NaN
2019-08-01 00:00:56    10    NaN     86.0
2019-08-01 00:00:08    12    NaN     90
2019-08-01 00:00:19    12   12.0     NaN
2019-08-01 00:00:28    12    NaN     NaN

Me gustaría aplicar el relleno hacia adelante y hacia atrás en las columnas 'ancho' y 'longitud' dentro de la columna 'nombre'. El resultado se vería así:

                     name  width  length
timestamp                           
2019-08-01 00:00:08    10   10.0     86
2019-08-01 00:00:19    10   10.0     86
2019-08-01 00:00:56    10   10.0     86
2019-08-01 00:00:08    12   12.0     90
2019-08-01 00:00:19    12   12.0     90
2019-08-01 00:00:28    12   12.0     90

¿Alguna idea de como hacer esto?

2
Jeroen 26 feb. 2020 a las 19:18

2 respuestas

La mejor respuesta

Necesitamos groupby con apply, ya que encadenamos dos funciones ffill y bfill juntas

df.update(df.groupby('name').apply(lambda x : x.ffill().bfill()))
2
YOBEN_S 26 feb. 2020 a las 16:28

Como dijiste que cada name único tiene un solo valor de width y length, puedes evitar apply usando transform y {{X5} } o first

df.update(df.groupby('name')[['width','length']].transform('max'))

Out[87]:
                     name  width  length
timestamp
2019-08-01 00:00:08    10   10.0    86.0
2019-08-01 00:00:19    10   10.0    86.0
2019-08-01 00:00:56    10   10.0    86.0
2019-08-01 00:00:08    12   12.0    90.0
2019-08-01 00:00:19    12   12.0    90.0
2019-08-01 00:00:28    12   12.0    90.0
1
Andy L. 26 feb. 2020 a las 17:36