将加权平均函数应用于pandas groupby对象中的列,但权重总和为零

时间:2019-04-12 10:59:41

标签: python pandas pandas-groupby

我将不同的功能应用于pandas groupby对象中的每一列。这些函数之一是加权平均值,其中权重是DataFrame另一列中的关联值。但是,对于我的许多组,权重之和为零。因此,我在运行代码时收到“重量总和为零,无法规范化”的错误消息。

请参阅下面的代码,对于由col1值x和col2值y定义的组,col1 = x和col2 = y的行中col3中的值之和为零,从而在col5。

是否有办法使权重总和为零的组返回零的“加权平均值”值?谢谢!

sql = (select([
          user.c.id,
          user.c.full_name
       ]).where(user.c.id == 123))

1 个答案:

答案 0 :(得分:0)

我们可以执行以下操作:

  • 编写我们自己的函数,以检查0col3中是否有col5。否则,采用加权平均值。
  • 使用权重平均值加权sum聚合
def weighted_average(x):
    if (x.col3 > 0).all() & (x.col5 > 0).all():
        return np.average(x.col5, weights=x.col3)
    else:
        return 0


averages = df.groupby(['col1','col2']).agg({'col3':'sum', 
                                            'col4':'sum'})

weighted_avg = df.groupby(['col1','col2']).apply(weighted_average)

df_averages = pd.concat([averages, weighted_avg ], axis=1)\
                .reset_index()\
                .rename({0:'col5'}, axis=1)

哪种产量:

print(df_averages)
           col3  col4      col5
col1 col2                      
x    a        0     2  0.000000
     b        3     1  4.000000
y    b        4     1  6.000000
     c       11     2  5.272727