2015-10-10 14 views
7

Sto cercando di imparare i panda ma sono rimasto perplesso con quanto segue per favore. Voglio sostituire NaNs è un dataframe con la media delle righe. Quindi qualcosa come df.fillna(df.mean(axis=1)) dovrebbe funzionare, ma per qualche motivo fallisce per me. Mi sto perdendo qualcosa per favore, qualcosa che sto sbagliando? È perché non è implementato; vedi link herePandas Dataframe: sostituzione NaN con riga media

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 

Tuttavia qualcosa di simile sembra funzionare bene

df.fillna(df.mean(axis=0)) 

Out[47]: 
    c1 c2 c3 
0 1 4 7 
1 2 5 8 
2 3 6 9 
+3

che la funzionalità non è ancora implementato - il [questione rimane aperta] (https://github.com/pydata/pandas/issues/4514). –

+0

Ok, grazie per questo! – Aenaon

risposta

12

come commentato l'argomento asse fillna è NotImplemented.

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

Nota: questo sarebbe fondamentale anche qui non si vuole compilare le colonne ennesimi con la media ennesima riga.

Per ora è necessario scorrere:

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 

Un'alternativa è quella di fillna la trasposizione e poi trasporre, che può essere più efficace ...

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

Grazie Andy, bella risposta – Aenaon

1

Come In alternativa, è possibile utilizzare anche un apply con un'espressione lambda in questo modo:

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

cedendo anche

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