2017-06-29 227 views
0

df [row、 'avg']行の平均と列の平均( 'impute [col]')に対応するオフセットでヌル値を代入しようとしています。メソッドを.mapと並列化する方法はありますか?または、ヌル値を含むインデックスを反復処理するより良い方法がありますか?Python Pandas Null値の代入

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) 

答えて

2

であなたの「充填」発現ということに注意:

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

第一項のみだけ行のカラムおよび第三に依存します。 2番目の定数は定数です。だから我々は満たされる必要がある値がありますたびルックアップするために帰属するデータフレームを作成することができます。

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

その後、あなたは別の値で1つのデータフレームでのNAを埋めることができます.combine_first()呼ばにおける方法があります、それはまさに私たちが必要とするものです。私たちは、これを使用すると、私たちが行っている:パンダで

test.combine_first(impute_df) 

を、あなたは一般的にループを使用しないようにしたい、とベクトル化を利用することを目指しています。

+0

それがうまくいった!ありがとう、私は.combine_firstメソッドを知らなかった。 – MyopicVisage

関連する問題