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

Posted

技术标签:

【中文标题】在 Multiindex Pandas 系列中获取每个组中最大的【英文标题】:Getting the nlargest of each group in a Multiindex Pandas Series 【发布时间】:2019-08-27 01:46:57 【问题描述】:

我有一个 DataFrame,其中包含自 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
           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

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

我以一种繁琐的方式半成功地解决了这个任务。如果我 groupby MultiIndex 的第 0 级,然后在该 groupby 上运行 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

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

【问题讨论】:

你想要它比这更好吗?如果你问我,这看起来不错。究竟是什么问题? 【参考方案1】:

在我看来,您的代码很好,group_keys=False 中的Series.groupby 只做了一点更改,以避免重复的 MultiIndex 级别:

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

【讨论】:

以上是关于在 Multiindex Pandas 系列中获取每个组中最大的的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 系列的 numpy 矩阵转换为 Multiindex 系列

Pandas Multiindex 系列级别重新索引

concat和sum multiindex pandas系列

multiIndex pandas 系列中的 set_codes

Pandas - 将 DataFrame 值除以 MultiIndex DataFrame 中的系列

Pandas:按值过滤,然后在 Multiindex 中获取最大值