我无法弄清楚如何编写函数来完成分组百分位数。 1985年至2012年,我拥有数据框架中的所有团队;前10个显示如下:它目前按年份排序。我希望按LgRnk
分组Year
给出百分位数。因此,例如,1985年的23 LgRank(最差的球队)将是100百分位,而1985年的1 LgRank(最佳球队)将是1百分位数。 2010年的LgRank(最差的团队)将为100百分位等。需要按不同LgRnk
个数的年份b / c进行分组。
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
创建功能
我无法得到它。
答案 0 :(得分:10)
您可以对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 groupby rank(仅适用于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
注意:我已更改了第一行的数字,因此您在完整框架上获得了不同的分数。
答案 1 :(得分:0)
您需要计算组内的排名,然后才能在组内进行归一化。其他答案将导致百分位数超过100%。我建议:
df['percentile'] = df.groupby('year')['LgRnk'].rank(pct=True)