在Pandas中按组计算百分位排名
我有点搞不清楚怎么写一个函数来计算分组的百分位数。我有一个数据框,里面包含了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
注意:我在第一行改了数字,所以你在你的 完整 数据框中会得到不同的分数。