使用Pandas数据框中的两列计算加权和

时间:2019-11-27 03:09:35

标签: python pandas dataframe

我正在尝试使用python数据框中的两列来计算加权和。

数据框结构:

unique_id   weight            value
1           0.061042375       20.16094523
1           0.3064548         19.50932003
1           0.008310739       18.76469039
1           0.624192086       21.25
2           0.061042375       20.23776924
2           0.3064548         19.63366165
2           0.008310739       18.76299395
2           0.624192086       21.25

.......

我想要的输出是:

每个unique_id的加权总和= sum((权重)*(值))

示例:unique_id 1的加权总和=((0.061042375 * 20.16094523)+(0.3064548 * 19.50932003)+(0.008310739 * 18.76469039)+(0.624192086 * 21.25))

我签出了这个答案(Calculate weighted average using a pandas/dataframe),但无法找出将其应用于我的特定情况的正确方法。

根据以上答案,这就是我正在做的事情:

#Assume temp_weighted_sum_dataframe is the dataframe stated above

grouped_data = temp_weighted_sum_dataframe.groupby('unique_id') #I think this groups data based on unique_id values
weighted_sum_output = (grouped_data.weight * grouped_data.value).transform("sum") #This should allow me to multiple weight and value for every record within each group and sum it up to one value for that group.

# On above line I am getting the error > TypeError: unsupported operand type(s) for *: 'SeriesGroupBy' and 'SeriesGroupBy'

感谢您的帮助,谢谢

3 个答案:

答案 0 :(得分:3)

链接问题中可接受的答案确实可以解决您的问题。但是,我只用一个groupby来解决问题:

u = (df.assign(s=df['weight']*df['value'])
       .groupby('unique_id')
       [['s', 'weight']]
       .sum()
     )

u['s']/u['weight']

输出:

unique_id
1    20.629427
2    20.672208
dtype: float64

答案 1 :(得分:2)

您可以这样操作:

df['partial_sum'] = df['weight']*df['value']
out = df.groupby('unique_id')['partial_sum'].agg('sum')

输出:

unique_id
1    20.629427
2    20.672208

或..

df['weight'].mul(df['value']).groupby(df['unique_id']).sum()

相同的输出

答案 2 :(得分:1)

您可以将aggagg@)结合使用dot

df.groupby('unique_id')[['weight']].agg(lambda x: x.weight @ x.value)

Out[24]:
              weight
unique_id
1          20.629427
2          20.672208