У меня есть DataFrame, который состоит из информации о каждой игре в НФЛ, которая происходила с 2009 года. Моя цель - выяснить, у каких команд было больше "больших игр" в каждом сезоне. Для этого я нашел все пьесы, которые набрали более 20 ярдов, сгруппировал их по годам и командам и получил размер каждой из этих групп.
big_plays = (df[df['yards_gained'] >= 20]
.groupby([df['game_date'].dt.year, 'posteam'])
.size())
Это приводит к следующей серии:
game_date posteam
2009 ARI 55
ATL 51
BAL 55
BUF 37
CAR 52
CHI 58
CIN 51
CLE 31
DAL 68
DEN 42
DET 42
GB 65
HOU 63
IND 67
JAC 51
KC 44
MIA 34
MIN 64
NE 48
NO 72
NYG 69
NYJ 54
OAK 38
PHI 68
PIT 72
SD 71
SEA 45
SF 51
STL 42
TB 51
..
2018 BAL 44
BUF 55
CAR 64
CHI 66
CIN 69
CLE 70
DAL 51
DEN 59
DET 51
GB 63
HOU 53
IND 57
JAX 51
KC 88
LA 80
LAC 77
MIA 47
MIN 56
NE 64
NO 66
NYG 70
NYJ 49
OAK 63
PHI 54
PIT 66
SEA 62
SF 69
TB 73
TEN 51
WAS 46
Length: 323, dtype: int64
Пока что это именно то, чего я хочу. Однако я застрял на следующем шаге. Мне нужны n-самые большие значения для каждой группы в MultiIndex или n-команд с наибольшим количеством "больших игр" за сезон.
Я полууспешно решил эту задачу громоздким способом. Если я groupby
0-й уровень MultiIndex, а затем запустить функцию nlargest
для этой группы, я получу следующее (для краткости усечено до первых двух лет):
big_plays.groupby(level=0).nlargest(5)
возвращает
game_date game_date posteam
2009 2009 NO 72
PIT 72
SD 71
NYG 69
DAL 68
2010 2010 PHI 81
NYG 78
PIT 78
SD 75
DEN 73
Это (довольно нелегко) решает проблему, но мне интересно, как мне лучше достичь более или менее таких же результатов.