使用 Pandas 中的两列计算加权总和

3

我正在尝试使用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的加权和=总和((权重)*(数值))

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

我查看了这个答案 (计算一个带有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个回答

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

2

您可以通过使用@(它是)与agg一起使用agg

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

Out[24]:
              weight
unique_id
1          20.629427
2          20.672208

1
你的代码能运行吗?[['weight']]没有value属性。 - Quang Hoang
1
@QuangHoang:是的,我试过了。你可以自己测试一下。我有点惊讶,但它确实可以正常运行。我猜这是agg的一个怪癖。它只能在[['...']]上运行,但在['...']上会出错 :) - Andy L.
它确实运行了。在我看来,那肯定是一个bug,但是没错 :-)。 - Quang Hoang
@QuangHoang: :)) +1 - Andy L.

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

or..

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

相同的输出


这在组内总重量等于1时有效,这种情况下会发生。此外,agg('sum')agg(sum)更好。 - Quang Hoang
如果你正在进行加权平均,最好希望你的权重/归一化权重等于1,否则你可能会遇到更大的问题 :) 谢谢...你能解释一下为什么“sum”比“sum”更好吗?我很好奇。 - Derek Eden
3
agg('sum')使用向量化版本,等同于np.sumpd.Series.sum(),而agg(sum)使用Python的非向量化sum - Quang Hoang
@DerekEden:你在结果中真的得到了unique_id列吗?我问这个是因为我没有得到它,但我必须得到它,因为我需要将其与另一个数据框相关联。 - user_11077035
我将您的数据复制粘贴到了一个csv文件中,然后读取并运行了那些命令,得到了那个输出结果。索引的名称是“unique_id”,而不是生成的系列。 - Derek Eden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接