在Pandas中按组计算百分位排名

12 投票
2 回答
18126 浏览
提问于 2025-04-17 21:52

我有点搞不清楚怎么写一个函数来计算分组的百分位数。我有一个数据框,里面包含了1985到2012年所有球队的数据;下面是前10个球队的数据,它们是按年份排序的。我想根据年份来计算LgRnk的百分位数。举个例子,1985年排名23的球队(最差的球队)会是100百分位,而排名1的球队(最好的球队)会是1百分位。2010年排名30的球队(最差的球队)也会是100百分位,依此类推。之所以需要按年份分组,是因为不同年份的LgRnk数量不一样。

    Team                WLPer   Year LgRnk   W  L
19  Sacramento Kings    0.378   1985    18  31  51
0   Atlanta Hawks       0.415   1985    17  34  48
17  Phoenix Suns        0.439   1985    16  36  46
4   Cleveland Cavaliers 0.439   1985    15  36  46
13  Milwaukee Bucks     0.720   1985    3   59  23
3   Chicago Bulls       0.463   1985    14  38  44
16  Philadelphia 76ers  0.707   1985    4   58  24
22  Washington Wizards  0.488   1985    13  40  42
20  San Antonio Spurs   0.500   1985    12  41  41
21  Utah Jazz           0.500   1985    11  41  41

我试着用这个链接中的方法:scipy.stats.percentileofscore来创建一个函数,但我还是搞不定。

2 个回答

4

你需要先在组内计算排名,然后再进行组内的标准化。其他的答案可能会导致百分比超过100%。我建议这样做:

df['percentile'] = df.groupby('year')['LgRnk'].rank(pct=True)
12

你可以对 LgRnk 列进行应用操作:

# just for me to normalize this, so my numbers will go from 0 to 1 in this example
In [11]: df['LgRnk'] = g.LgRnk.rank()

In [12]: g = df.groupby('Year')

In [13]: g.LgRnk.apply(lambda x: x / len(x))
Out[13]:
19    1.0
0     0.9
17    0.8
4     0.7
13    0.1
3     0.6
16    0.2
22    0.5
20    0.4
21    0.3
Name: 1985, dtype: float64

这个 Series 按照排名分组(其实就是用 Series.rank 这个方法)可以使用 pct 参数来实现这个功能:

In [21]: g.LgRnk.rank(pct=True)
Out[21]:
19    1.0
0     0.9
17    0.8
4     0.7
13    0.1
3     0.6
16    0.2
22    0.5
20    0.4
21    0.3
Name: 1985, dtype: float64

而且也可以直接对 WLPer 列进行操作(虽然因为平局的原因,这个稍微有点不同):

In [22]: g.WLPer.rank(pct=True, ascending=False)
Out[22]:
19    1.00
0     0.90
17    0.75
4     0.75
13    0.10
3     0.60
16    0.20
22    0.50
20    0.35
21    0.35
Name: 1985, dtype: float64

注意:我在第一行改了数字,所以你在你的 完整 数据框中会得到不同的分数。

撰写回答