使用列值和行值的平均值填充NA值

时间:2016-07-22 13:15:42

标签: python python-2.7 pandas

我有下一个数据框

     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

1 个答案:

答案 0 :(得分: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