我有两个数据帧df1和df2,每个数据帧具有相同的列数和相同的列名,但具有不同的行数。基本上,df2中有很多列都为0。
我要完成的工作是将df2中所有零值列替换为相同列名的平均值(平均值)(如df1中一样)。
因此,如果df1具有类似以下的结构:-
Column1 Column2 ------ Column n
0.4 2.3 1.7
0.7 2.5 1.4
0.1 2.1 1.2
和df2具有类似的结构:-
Column1 Column2 ------ Column n
0 2.3 1.7
0 2.5 1.4
0 2.1 1.2
我想用df1中映射的同一列的平均值替换column1(以及df2中的所有其他全零列)。 因此,df2最终看起来像:-
Column1 Column2 ------ Column n
0.4 2.3 1.7
0.4 2.5 1.4
0.4 2.1 1.2
(df2第1列中的所有零值均替换为df1中第1列的平均值。
我对此还很陌生,已经检查了其他选项,例如fillna()和replace(),但是无法完全实现我想要的功能。在这方面的任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
将DataFrame.mask
与mean
一起使用:
df = df2.mask(df2 == 0, df1.mean(), axis=1)
print (df)
Column1 Column2 Column n
0 0.4 2.3 1.7
1 0.4 2.5 1.4
2 0.4 2.1 1.2
numpy
和numpy.where
的替代方案在大型DataFrame中应该能更快地工作:
df = pd.DataFrame(np.where(df2 == 0, df1.mean(), df1),
index=df1.index,
columns=df1.columns)
print (df)
Column1 Column2 Column n
0 0.4 2.3 1.7
1 0.4 2.5 1.4
2 0.4 2.1 1.2