给定一个数据框,我想编写一个函数来计算一组给定列的组加权平均值。
比如我有一个数据框
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'].
我知道我可以创建一个循环来一次处理一个变量,然后将结果合并在一起,但这会非常低效。有没有办法在函数内以编程方式一次处理所有变量列表?
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())