pandas llenando nans por medio de antes y después de valores no nan

Me gustaría llenar el nan df con un promedio de elementos adyacentes.

Considere un dataframe:

 df = pd.DataFrame({'val': [1,np.nan, 4, 5, np.nan, 10, 1,2,5, np.nan, np.nan, 9]}) val 0 1.0 1 NaN 2 4.0 3 5.0 4 NaN 5 10.0 6 1.0 7 2.0 8 5.0 9 NaN 10 NaN 11 9.0 

Mi salida deseada es:

  val 0 1.0 1 2.5 2 4.0 3 5.0 4 7.5 5 10.0 6 1.0 7 2.0 8 5.0 9 7.0 <<< deadend 10 7.0 <<< deadend 11 9.0 

He analizado otras soluciones, como la celda de relleno que contiene NaN con un valor medio antes y después , pero esto no funcionará en caso de que haya dos o más np.nan s consecutivos.

¡Cualquier ayuda es muy apreciada!

Use ffill + bfill y divida por 2:

 df = (df.ffill()+df.bfill())/2 print(df) val 0 1.0 1 2.5 2 4.0 3 5.0 4 7.5 5 10.0 6 1.0 7 2.0 8 5.0 9 7.0 10 7.0 11 9.0 

EDITAR: Si el 1er y último elemento contiene NaN , use (sugerencia Dark ):

 df = pd.DataFrame({'val':[np.nan,1,np.nan, 4, 5, np.nan, 10, 1,2,5, np.nan, np.nan, 9,np.nan,]}) df = (df.ffill()+df.bfill())/2 df = df.bfill().ffill() print(df) val 0 1.0 1 1.0 2 2.5 3 4.0 4 5.0 5 7.5 6 10.0 7 1.0 8 2.0 9 5.0 10 7.0 11 7.0 12 9.0 13 9.0