[英]How do I find weighted percentiles for each row within a group in Python?
假设我有以下 dataframe。 最后一列是我需要的,我有 rest 列。类别内的百分位数计算为价格的加权百分位数,权重为该类别内销售的商品数量
| Category | Price | Items Sold | Percentile within category|
|:-----------|------------:|:------------:|:--------------------------:|
| A | 560 | 5 | 92.56 |
| A | 360 | 2 | 12.56 |
| B | 510 | 3 | 42.56 |
| A | 520 | 4 | 72.36 |
| B | 960 | 6 | 91.56 |
| C | 130 | 2 | 100.00 |
我需要使用的 function 是 stats.percentileofscore。 但我不确定如何使用它。
编辑:插入 dataframe 的图像,因为不确定如何显示表格
Edit2:我还没有准确计算所有行的 output 值。 对于 A-560,它应该是 81.81%,因为
stats.percentileofscore([560,560,560,560,560,360,360,520,520,520,520], 560)
给出 81.81%
您可以使用简单的 groupby 并应用 function 来获取加权值
data = {'Category' : ['A', 'A', 'B', 'A', 'B', 'C'],
'Price' : [560, 360, 510, 520, 960, 130],
'Items' : [5, 2, 3, 4, 6, 2]}
df = pd.DataFrame(data).sort_values('Category')
def fun(x):
t = (x['Price'] * x['Items']).sum()
return (x['Price'] * x['Items'])/t
df['weighted'] = df.groupby('Category').apply(fun).values
必须有更好的方法,因为这取决于正确的排序顺序。 也许有人会加入并提供更好的解决方案。
结果:
Category Price Items weighted
0 A 560 5 0.500000
1 A 360 2 0.128571
3 A 520 4 0.371429
2 B 510 3 0.209877
4 B 960 6 0.790123
5 C 130 2 1.000000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.