繁体   English   中英

如何在 Python 中找到组内每一行的加权百分位数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM