为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

RISEBY 2021-12-29 20:09:04
我有一个数据帧,其中包含自 2009 年以来发生的每场 NFL 比赛的信息。我的目标是找出每个赛季哪些球队拥有最多的“重要比赛”。为了做到这一点,我找到了所有超过 20 码的比赛,按年份和球队对它们进行分组,并得到每个组的大小。big_plays = (df[df['yards_gained'] >= 20]             .groupby([df['game_date'].dt.year, 'posteam'])             .size())这导致以下系列:game_date  posteam2009       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        59Length: 323, dtype: int64到目前为止,这正是我想要的。但是,我被困在下一步。我想要 MultiIndex 中每个组的 n 个最大值,或者每个赛季“大戏”次数最多的 n 支球队。我以一种繁琐的方式半成功地解决了这个任务。如果我groupby是 MultiIndex 的第 0 级,然后nlargest在该 groupby 上运行该函数,则会得到以下结果(为简洁起见,截断为前两年):big_plays.groupby(level=0).nlargest(5)回报game_date  game_date  posteam2009       2009       NO         72                      PIT        72                      SD         71                      NYG        69                      DAL        682010       2010       PHI        81                      NYG        78                      PIT        78                      SD         75                      DEN        73这(相当不雅)解决了问题,但我想知道如何更好地实现或多或少相同的结果。
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

在我看来,你的代码是好的,只是受了一点变化group_keys=False在Series.groupby为避免重复多指标的水平:


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.groupby(level=0, group_keys=False).nlargest(5).reset_index(name='count')

print (df)

   game_date posteam  count

0       2009      NO     72

1       2009     PIT     72

2       2009      SD     71

3       2009     NYG     69

4       2009     DAL     68

5       2018      KC     88

6       2018      LA     80

7       2018     LAC     77

8       2018      TB     73

9       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


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信