百分比在群体中的大熊猫排名

时间:2014-03-12 00:46:37

标签: python numpy pandas statistics scipy

我无法弄清楚如何编写函数来完成分组百分位数。 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创建功能 我无法得到它。

2 个答案:

答案 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)