计算 Pandas 中变量列表的加权平均值

问题描述 投票:0回答:1

给定一个数据框,我想编写一个函数来计算一组给定列的组加权平均值。

比如我有一个数据框

mydf = pd.DataFrame({
'group' : np.array(['A', 'B', 'C', 'D', 'E']*20),
'weight' : np.array(list(range(1,6))*20),
'x1' : np.random.uniform(100, 200, 100),
'x2' : np.random.uniform(200, 300, 100),
'x3' : np.random.uniform(300, 400, 100),
...
'x999': np.random.uniform(99900, 100000, 100),
})

我可以使用以下方法计算每个变量的加权平均值

wm = mydf \
.groupby('group') \
.apply(
    lambda x: pd.Series({
        'x1' : np.average(x['x1'], weights=x['weight']),
        'x2' : np.average(x['x2'], weights=x['weight']),
        'x3' : np.average(x['x3'], weights=x['weight']),
        ...
        'x999' : np.average(x['x999'], weights=x['weight']),
            })
) \
.reset_index()

问题是我需要定义一个函数来计算任意变量列表的加权平均值,例如['x11','x12','x16','x77'].

我知道我可以创建一个循环来一次处理一个变量,然后将结果合并在一起,但这会非常低效。有没有办法在函数内以编程方式一次处理所有变量列表?

python pandas aggregate weighted-average
1个回答
1
投票

np.average
weights
很简单,你可以重写如下:

my_list = ['x1','x2','x3']
mydf.groupby('group')[my_list+['weight']]
    .apply(lambda x: x[my_list].mul(x['weight'], axis=0) / x['weight'].sum())
© www.soinside.com 2019 - 2024. All rights reserved.