您应该乘以列中的值 ,而不是列名本身,例如:
df['weighted_mean']= 0.3*df['size'] + 0.5*df['price'] + 0.2*df['distance']
由于权重之和为1.0,因此这里不需要除法。
对于给定的数据,这将导致:
>>> 0.3*df['size'] + 0.5*df['price'] + 0.2*df['distance']
0 19.0
1 23.0
2 39.0
3 14.5
dtype: float64
我们可以用字典来概括以上内容,例如:
def weighted_sum(df, weights):
return df[list(weights)].mul(weights).sum(axis=1) / sum(weights.values())
例如:
>>> weighted_sum(df, {'size': 0.3, 'price': 0.5, 'distance': 0.2})
0 19.0
1 23.0
2 39.0
3 14.5
dtype: float64
如果所有权重都乘以2,则没有区别:
>>> weighted_sum(df, {'size': 0.6, 'price': 1.0, 'distance': 0.4})
0 19.0
1 23.0
2 39.0
3 14.5
dtype: float64
但是,如果我们增加一个值,则会看到结果不同:
>>> weighted_sum(df, {'size': 0.3, 'price': 1.0, 'distance': 0.2})
0 19.333333
1 25.333333
2 39.333333
3 14.666667
dtype: float64
性能 :如果我们以给定的weighted_sum重在给定的数据集上运行weighted_sum 1'000次,我们将获得以下基准:
>>> timeit(partial(weighted_sum, df, {'size': 0.3, 'price': 1.0, 'distance': 0.2}), number=1000)
1.3530528700212017
因此,在2.70GHz的Intel®Core ™i7-7500U CPU上,此调用的运行时间仅为1.353ms 。