我有几个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,依此类推。
有没有好的和优雅的方法呢?
答案 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.nan
为float
,我们会明确转换回int
。