あなたは算術演算で作業しているので、私は、numpyのにすべてのそれらの計算の負荷を軽減示唆最終結果を取得し、データフレームを作成し、そのたい - さらなるパフォーマンスの向上のために
# Extract into an array
arr = Y.values
# Mask to set or not-set elements in array
mask = arr!=2
# Compute the mean vaalues for masked elements along each column
avg = np.true_divide((arr*mask).sum(0),mask.sum(0))
# Finally choose values based on mask and create output dataframe
Yout = pd.DataFrame(np.where(~mask,avg,arr),columns=Y.columns)
、あなたはおそらく置き換えることができます(arr*mask).sum(0)
とnp.einsum('ij,ij->j',arr,mask)
をnp.einsum
とすると、ほとんどの場合非常に効率的です。
サンプル実行して結果を確認します -
In [128]: Y = pd.DataFrame(np.random.randint(0,4,(10,5)))
In [129]: arr = Y.values
...: mask = arr!=2
...: avg = np.true_divide((arr*mask).sum(0),mask.sum(0))
...: Yout = pd.DataFrame(np.where(~mask,avg,arr),columns=Y.columns)
...:
In [130]: for i in Y.columns:
...: x = Y[i][Y[i] != 2].mean()
...: Y[i][Y[i] == 2] = x
...:
In [131]: np.allclose(Y,Yout)
Out[131]: True
両方の素晴らしい回答、ありがとうございます!私はあなたの仕事と同じように素早く仕事をしているので、piRSquaredを受け入れています。そして、彼は1時間前に質問しました(私は目が覚めていて、私はそれを受け入れました)。 – atomsmasher