Python 获取多索引系列中每个组的最大值
我有一个数据框架,它包含了自2009年以来发生的每一场NFL比赛的信息。我的目标是找出哪个球队在每个赛季都有最多的“重大比赛”。为了做到这一点,我找到了所有超过20码的比赛,按年份和球队进行分组,并得到了每个小组的大小Python 获取多索引系列中每个组的最大值,python,pandas,pandas-groupby,series,multi-index,Python,Pandas,Pandas Groupby,Series,Multi Index,我有一个数据框架,它包含了自2009年以来发生的每一场NFL比赛的信息。我的目标是找出哪个球队在每个赛季都有最多的“重大比赛”。为了做到这一点,我找到了所有超过20码的比赛,按年份和球队进行分组,并得到了每个小组的大小 big_plays = (df[df['yards_gained'] >= 20] .groupby([df['game_date'].dt.year, 'posteam']) .size()) 这将导致以下系列: ga
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个最大值,或者每个赛季“重要比赛”最多的n个球队
我以一种笨拙的方式半成功地解决了这项任务。如果我groupby
多索引的第0级,然后在该groupby上运行nlargest
函数,我将得到以下结果(为了简洁起见,将其截断为前两年):
big\u plays.groupby(级别=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
这(相当不雅观)解决了问题,但我想知道如何才能更好地实现或多或少相同的结果。我认为您的代码很好,只有在中的
group\u keys=False
做了一点更改,以避免重复的多索引级别:
s = big_plays.groupby(level=0, group_keys=False).nlargest(5)
print (s)
game_date posteam
2009 NO 72
PIT 72
SD 71
NYG 69
DAL 68
2018 KC 88
LA 80
LAC 77
TB 73
CLE 70
Name: a, dtype: int64
替代方案更为复杂:
df = (big_plays.reset_index(name='count')
.sort_values(['game_date','count'], ascending=[True, False])
.groupby('game_date')
.head(5))
print (df)
game_date posteam count
19 2009 NO 72
24 2009 PIT 72
25 2009 SD 71
20 2009 NYG 69
8 2009 DAL 68
43 2018 KC 88
44 2018 LA 80
45 2018 LAC 77
57 2018 TB 73
35 2018 CLE 70
你想要比这更好的吗?如果你问我的话,这看起来不错。到底是什么问题?
df = (big_plays.reset_index(name='count')
.sort_values(['game_date','count'], ascending=[True, False])
.groupby('game_date')
.head(5))
print (df)
game_date posteam count
19 2009 NO 72
24 2009 PIT 72
25 2009 SD 71
20 2009 NYG 69
8 2009 DAL 68
43 2018 KC 88
44 2018 LA 80
45 2018 LAC 77
57 2018 TB 73
35 2018 CLE 70