2016-07-22 93 views
1

我旁邊據幀填充NA值與平均值

 A B C D E F 
0 158 158 158 177 1 10 
1 158 158 158 177 2 20 
2 177 177 177 177 3 30 
3 1 3 5 7 NaN 10 
4 177 177 177 177 6 50 

現在我試圖得到一個新的數據幀,其中E3 = AVG [AVG(E)= 3,AVG( 3)= 5] = 4

 A B C D E F 
0 158 158 158 177 1 10 
1 158 158 158 177 2 20 
2 177 177 177 177 3 30 
3 1 3 5 7 [4] 10 
4 177 177 177 177 6 50 
+0

您所需的輸出與您的問題描述完全不符。爲什麼第3行的所有其他行值都被修改了?爲什麼E的最後一行變成6?它看起來好像你真的插值後 – EdChum

+0

我的不好,已經固定的初始數據框 – SpanishBoy

+0

仍然錯(3 + 6)/ 2 = 4.5的平均值不是4.你是否在'df.apply(lambda x:x.fillna (x.interpolate())' – EdChum

回答

1

我不能找到但是一襯墊如果你能保持三個數據幀在存儲器

  • 一個用行平均
  • 另一個用柱平均值
  • 第三與平均上述兩個

的然後fillna將基於在第三數據幀中的確切位置替換NaN值。

import pandas as pd 
import numpy as np 
data = [[158,158,158,177,1,10] 
     ,[158,158,158,177,2,20] 
     ,[177,177,177,177,3,30] 
     ,[1,3,5,7,np.NaN,10] 
     ,[177,177,177,177,6,50]] 
df = pd.DataFrame(data=data) 
# row and column means replicated over columns and rows 
mean0 = (pd.concat([df.mean(axis=0)]*df.shape[0], axis=1, ignore_index=True)).transpose() 
mean1 = pd.concat([df.mean(axis=1)]*df.shape[1], axis=1, ignore_index=True) 
# average of mean0 and mean1 
m = mean0.add(mean1)/2 
df = df.fillna(m) 
df 
    0  1  2  3  4  5 
0 158  158  158  177  1.0  10 
1 158  158  158  177  2.0  20 
2 177  177  177  177  3.0  30 
3 1  3  5  7  4.1  10 
4 177  177  177  177  6.0  50