在 Python 中使用 groupby 计算加权平均值
Calculate the weighted average using groupby in Python
这是我目前正在处理的数据框:
df_weight_0
我想计算的是变量“avg_lag”在每个 product_basket 中由“tot_SKU”加权的 SMB 和 CORP 组的平均值。
这意味着,以 CORP 为例,我想计算一些东西:
(585,134 * 46.09 + 147,398 * 104.55 + ... + 1,112,941 * 75.73) / (585,134 + 147,398 + ... + 1,112,941)
SMB 也需要做同样的事情。
理想情况下,我希望将这两个数字放在上面数据框中的新列中(SMB 和 CORP 行将根据如上所示计算的两个值重复加权平均值)。
P.S。我将在更多层次上进行更深入的分析,因此方法越通用越好。
提前致谢,
斯特凡诺
所以我认为这应该可以解决问题
import pandas as pd
def calculator(df, columns):
weighted_sum = (df[columns[0]]*df[columns[1]]).sum()/df[columns[0]].sum()
return weighted_sum
cols = ['tot_SKU', 'avg_lag']
Sums = df.groupby('SF_type').apply(lambda x: calculator(x, cols))
df.join(Sums.rename(('sums')), on='SF_type')
编辑:添加了请求的与旧数据框的合并
这是我目前正在处理的数据框:
df_weight_0
我想计算的是变量“avg_lag”在每个 product_basket 中由“tot_SKU”加权的 SMB 和 CORP 组的平均值。 这意味着,以 CORP 为例,我想计算一些东西:
(585,134 * 46.09 + 147,398 * 104.55 + ... + 1,112,941 * 75.73) / (585,134 + 147,398 + ... + 1,112,941)
SMB 也需要做同样的事情。
理想情况下,我希望将这两个数字放在上面数据框中的新列中(SMB 和 CORP 行将根据如上所示计算的两个值重复加权平均值)。
P.S。我将在更多层次上进行更深入的分析,因此方法越通用越好。
提前致谢,
斯特凡诺
所以我认为这应该可以解决问题
import pandas as pd
def calculator(df, columns):
weighted_sum = (df[columns[0]]*df[columns[1]]).sum()/df[columns[0]].sum()
return weighted_sum
cols = ['tot_SKU', 'avg_lag']
Sums = df.groupby('SF_type').apply(lambda x: calculator(x, cols))
df.join(Sums.rename(('sums')), on='SF_type')
编辑:添加了请求的与旧数据框的合并