将整个数据框中的NaN值替换为其他数据库的平均值

时间:2018-04-09 14:10:36

标签: python pandas numpy dataframe nan

我有几个DataFrame(DataFrames具有相同的索引和列结构)。问题是这些数据框中有NaN值。

我想将这些NaN值替换为其他数据框的平均值'相应的值。

对于exapmle,我们来看看3个数据帧。

DataFrame1与1:M2 NaN:

   M1   M2    M3        
0  1    1     2  
1  8   NaN    9 
2  4    2     7       
3  9    6     3  

DataFrame 2,NaN值为0:M3

   M1   M2    M3        
0  2    3    NaN  
1  1    1     6 
2  1    2     9       
3  4    6     2

DataFrame3:

   M1   M2    M3        
0  1    4     2  
1  2    9     1 
2  1    6     5       
3  1    NaN     4

因此我们将第一个DataFrame中的NaN替换为5 (9+1)/2。第二个NaN应该被2替换,因为(2+2)/2,第三个是6,依此类推。

有没有好的和优雅的方法呢?

2 个答案:

答案 0 :(得分:1)

我们可以concat,然后使用groupby fillna,分割后应该得到你需要的东西

s=pd.concat([df1,df2,df3],keys=[1,2,3])
s=s.groupby(level=1).apply(lambda x : x.fillna(x.mean()))
df1,df2,df3=[x.reset_index(level=0,drop=True) for _,x in s.groupby(level=0)]
df1
Out[1737]: 
   M1   M2   M3
0   1  1.0  2.0
1   8  5.0  9.0
2   4  2.0  7.0
3   9  6.0  3.0

答案 1 :(得分:1)

这是使用numpy.nanmean的一种方法。

avg = np.nanmean([df1.values, df2.values, df3.values], axis=0)

for df in [df1, df2, df3]:
    df[df.isnull()] = avg
    df = df.astype(int)

注意:由于np.nanfloat,我们会明确转换回int