Frage Perzentil Rang in Pandas in Gruppen


Ich kann nicht recht herausfinden, wie man eine Funktion schreibt, um ein gruppiertes Perzentil zu erreichen. Ich habe alle Teams aus den Jahren 1985-2012 in einem Datenrahmen; die ersten 10 werden unten angezeigt: es ist derzeit nach Jahr sortiert. Ich habe versucht, ein Perzentil dafür zu geben LgRnk gruppiert nach Year. So wäre zum Beispiel 23 LgRank (schlechteste Mannschaft) für 1985 ein 100 Perzentil und ein 1 LgRank (beste Mannschaft) für 1985 wäre ein 1 Perzentil. 30 LgRank (schlechtestes Team) für 2010 wäre 100 Perzentil, etc. Es muss nach Jahr b / c der abweichenden Anzahl von gruppiert werden LgRnks.

    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

Ich habe versucht, eine Funktion zu erstellen mit: scipy.stats.percentileofscore und ich kann es nicht ganz verstehen.


8
2018-03-12 00:46


Ursprung


Antworten:


Sie können einen Antrag für die Spalte LgRnk ausführen:

# 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

Die Serie groupby rank (die nur gilt Series.rank) nimm ein pct-Argument, um genau das zu tun:

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

und direkt auf der WLPer Spalte (obwohl dies aufgrund von Draws etwas anders ist):

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

Hinweis: Ich habe die Zahlen in der ersten Zeile geändert, so dass Sie unterschiedliche Punkte auf Ihrem Konto erhalten Komplett Rahmen.


10
2018-03-12 02:43