我想从以下数据框中获取每个(0.10, 0.20, ..., 0.50)
的多个自定义百分位数type
值:
type value
0 a 90
1 a 63
2 a 11
3 a 61
4 a 78
5 a 67
6 a 89
7 a 12
8 a 43
9 a 30
10 b 72
11 b 84
12 b 74
13 b 66
14 b 80
15 b 75
16 b 47
17 b 22
18 b 5
19 b 64
20 b 32
21 b 45
我已经执行此步骤:
df['percentile_rank'] = df.groupby('type').value.rank(pct=True).round(2)
输出:
type value percentile_rank
0 a 90 1.00
1 a 63 0.60
2 a 11 0.10
3 a 61 0.50
4 a 78 0.80
5 a 67 0.70
6 a 89 0.90
7 a 12 0.20
8 a 43 0.40
9 a 30 0.30
10 b 72 0.67
11 b 84 1.00
12 b 74 0.75
13 b 66 0.58
14 b 80 0.92
15 b 75 0.83
16 b 47 0.42
17 b 22 0.17
18 b 5 0.08
19 b 64 0.50
20 b 32 0.25
21 b 45 0.33
但是我不知道如何获得这样的预期结果:
type top10 top20 top30 top40 top50
0 a 89 78 67 63 61
1 b 80 75 72 66 64
在上表中,top10
代表percentile_rank
等于0.90
,top20
代表0.80
,依此类推。如果没有精确的百分位值,则取最接近的值,例如,top10
代表type
的b
,我使用80
为percentile_rank
的0.92
的值。
感谢您的帮助。
我们可以做quantile
s=df.groupby('type').value.apply(lambda x : x.quantile([0.9,.8,.7,.6,.5])).unstack()
Out[64]:
0.9 0.8 0.7 0.6 0.5
type
a 89.1 80.2 70.3 64.6 62.0
b 79.5 74.8 73.4 69.6 65.0