Pandas Dataframe: Reemplazo de NaN por promedio de filas

Estoy tratando de aprender pandas, pero me ha sorprendido lo siguiente, por favor. Quiero reemplazar NaNs es un dataframe con el promedio de la fila. Por lo tanto, algo como df.fillna(df.mean(axis=1)) debería funcionar, pero por alguna razón me falla. ¿Me estoy perdiendo algo por favor, algo que estoy haciendo mal? Es porque no está implementado; ver enlace aquí

 import pandas as pd import numpy as np​ pd.__version__ Out[44]: '0.15.2' In [45]: df = pd.DataFrame() df['c1'] = [1, 2, 3] df['c2'] = [4, 5, 6] df['c3'] = [7, np.nan, 9] df Out[45]: c1 c2 c3 0 1 4 7 1 2 5 NaN 2 3 6 9 In [46]: df.fillna(df.mean(axis=1)) Out[46]: c1 c2 c3 0 1 4 7 1 2 5 NaN 2 3 6 9 

Sin embargo, algo como esto parece funcionar bien

 df.fillna(df.mean(axis=0)) Out[47]: c1 c2 c3 0 1 4 7 1 2 5 8 2 3 6 9 

Como se comentó, el argumento del eje para rellenar no está implementado .

 df.fillna(df.mean(axis=1), axis=1) 

Nota: esto sería crítico aquí ya que no desea completar sus columnas nth con el promedio de la fila nth.

Por ahora necesitarás iterar a través de:

 In [11]: m = df.mean(axis=1) for i, col in enumerate(df): # using i allows for duplicate columns # inplace *may* not always work here, so IMO the next line is preferred # df.iloc[:, i].fillna(m, inplace=True) df.iloc[:, i] = df.iloc[:, i].fillna(m) In [12]: df Out[12]: c1 c2 c3 0 1 4 7.0 1 2 5 3.5 2 3 6 9.0 

Una alternativa es rellenar la transposición y luego transponer, lo que puede ser más eficiente …

 df.T.fillna(df.mean(axis=1)).T 

Como alternativa, también podría usar una apply con una expresión lambda como esta:

 df.apply(lambda row: row.fillna(row.mean()), axis=1) 

cediendo tambien

  c1 c2 c3 0 1.0 4.0 7.0 1 2.0 5.0 3.5 2 3.0 6.0 9.0