2017-06-29 4 views
0

Ich versuche Nullwerte mit einem Offset zu imputieren, der dem Durchschnitt der Zeile df [row, 'avg'] und dem Durchschnitt der Spalte ('imput [col]') entspricht. Gibt es eine Möglichkeit, dies zu tun, damit die Methode mit .map parallelisiert wird? Oder gibt es eine bessere Möglichkeit, die Indizes mit Nullwerten zu durchlaufen? Python Pandas Imputation von Nullwerten

test = pd.DataFrame({'a':[None,2,3,1], 'b':[2,np.nan,4,2], 
        'c':[3,4,np.nan,3], 'avg':[2.5,3,3.5,2]}); 
df = df[['a', 'b', 'c', 'avg']]; 
impute = dict({'a':2, 'b':3.33, 'c':6 }) 

def smarterImpute(df, impute): 
    df2 = df 
    for col in df.columns[:-1]: 
     for row in test.index: 
      if pd.isnull(df.loc[row,col]): 
       df2.loc[row, col] = impute[col] 
            + (df.loc[:,'avg'].mean() - df.loc[row,'avg']) 

return print(df2) 

smarterImpute(test, impute) 

Antwort

2

Beachten Sie, dass in Ihrem ‚Füllung‘ Ausdruck:

impute[col] + (df.loc[:,'avg'].mean() - df.loc[row,'avg']` 

Der erste Term nur auf der Säule hängt und die dritte nur auf der Reihe; das zweite ist nur eine Konstante. So können wir einen Anrechnungsdatenrahmen schaffen bis zu suchen, sobald ein Wert ist, der gefüllt werden muss:

impute_df = pd.DataFrame(impute, index = test.index).add(test.avg.mean() - test.avg, axis = 0) 

Dann gibt es ein Verfahren, bei namens .combine_first(), dass Sie die NAs in einem Datenrahmen mit den Werten eines anderen füllen kann, Genau das brauchen wir. Wir verwenden diese, und wir sind fertig:

test.combine_first(impute_df) 

Mit Pandas, Sie wollen in der Regel Schleifen vermeiden verwenden und versuchen, den Einsatz der Vektorisierung zu machen.

+0

Das hat funktioniert! Danke, ich war mir der .combine_first Methode nicht bewusst. – MyopicVisage