2017-06-29 1 views
0

J'essaie d'imputer des valeurs Null avec un décalage qui correspond à la moyenne de la ligne df [row, 'avg'] et la moyenne de la colonne ('impute [col]'). Existe-t-il un moyen de faire cela qui rendrait la méthode parallélisée avec .map? Ou existe-t-il un meilleur moyen de parcourir les index contenant des valeurs Null?Python Pandas imputation de valeurs nulles

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) 

Répondre

2

Notez que dans votre « remplissage » expression:

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

Le premier terme ne dépend que de la colonne et le troisième seulement sur la ligne; la seconde est juste une constante. Ainsi, nous pouvons créer une trame de données d'imputation pour rechercher chaque fois qu'il ya une valeur qui doit être remplie:

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

Ensuite, il y a une méthode appelée .combine_first() qui vous permet de remplir les agences nationales dans une trame de données avec les valeurs d'une autre, ce qui est exactement ce dont nous avons besoin. Nous utilisons, et nous avons terminé:

test.combine_first(impute_df) 

Avec pandas géants, vous voulez généralement éviter d'utiliser des boucles, et cherchent à faire usage de vectorisation.

+0

Cela a fonctionné! Merci, je n'étais pas au courant de la méthode .combine_first. – MyopicVisage