在 Multiindex Pandas 系列中获取每个组中的最大者

我有一个数据帧,其中包含自 2009 年以来发生的每场 NFL 比赛的信息。我的目标是找出每个赛季哪些球队拥有最多的“重要比赛”。为了做到这一点,我找到了所有超过 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

Length: 323, dtype: int64

到目前为止,这正是我想要的。但是,我被困在下一步。我想要 MultiIndex 中每个组的 n 个最大值,或者每个赛季“大戏”次数最多的 n 支球队。


我以一种繁琐的方式半成功地解决了这个任务。如果我groupby是 MultiIndex 的第 0 级,然后nlargest在该 groupby 上运行该函数,则会得到以下结果(为简洁起见,截断为前两年):


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

这(相当不雅)解决了问题,但我想知道如何更好地实现或多或少相同的结果。


RISEBY
浏览 138回答 1
1回答

呼啦一阵风

在我看来,你的代码是好的,只是受了一点变化group_keys=False在Series.groupby为避免重复多指标的水平:s = big_plays.groupby(level=0, group_keys=False).nlargest(5)print (s)game_date  posteam2009       NO         72           PIT        72           SD         71           NYG        69           DAL        682018       KC         88           LA         80           LAC        77           TB         73           CLE        70Name: a, dtype: int64df = big_plays.groupby(level=0, group_keys=False).nlargest(5).reset_index(name='count')print (df)   game_date posteam  count0       2009      NO     721       2009     PIT     722       2009      SD     713       2009     NYG     694       2009     DAL     685       2018      KC     886       2018      LA     807       2018     LAC     778       2018      TB     739       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  count19       2009      NO     7224       2009     PIT     7225       2009      SD     7120       2009     NYG     698        2009     DAL     6843       2018      KC     8844       2018      LA     8045       2018     LAC     7757       2018      TB     7335       2018     CLE     70
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python