【问题标题】:Replace zero valued columns in one data frame with mean values of same name column in another data frame将一个数据框中的零值列替换为另一个数据框中同名列的平均值
【发布时间】:2019-07-22 07:21:17
【问题描述】:

我有两个数据框,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(),但无法完全完成我想要的。非常感谢这方面的任何帮助。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将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
    

    【讨论】:

    • 很好的答案。一个班轮,正是我想要的!谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多