pandas 获取每个类别的最多 3 个分数行

pandas get the max 3 score rows for each category

我得到如下列表:

cat score name
a   80  fa
c   88  lu
b   36  li
b   96  liu
d   99  zc
b   76  mi
d   89  lu
a   50  fa
d   69  zhang
b   36  huang
d   59  guan
b   96  ka
b   86  chao
c   98  le
a   50  mi
a   90  zc
c   83  chao
b   66  guan

如何使用pandas可以得到每只猫最多3行的分数?显示所有三行

您可以使用 groupby with nlargest:

print (df.groupby('cat')['score'].nlargest(3))
cat    
a    15    90
     0     80
     7     50
b    3     96
     11    96
     12    86
c    13    98
     1     88
     16    83
d    4     99
     6     89
     8     69
Name: score, dtype: int64

如果需要 reset_index 并删除 Multiindexlevel=1:

df1 = df.groupby('cat')['score']
        .nlargest(3)
        .reset_index(level=1, drop=True)
        .reset_index()

print (df1)
   cat  score
0    a     90
1    a     80
2    a     50
3    b     96
4    b     96
5    b     86
6    c     98
7    c     88
8    c     83
9    d     99
10   d     89
11   d     69

通过评论编辑:

groupby set_index 之前来自列 name:

df1 = df.set_index('name').groupby('cat')['score'].nlargest(3).reset_index()
print (df1)
   cat   name  score
0    a     zc     90
1    a     fa     80
2    a     fa     50
3    b    liu     96
4    b     ka     96
5    b   chao     86
6    c     le     98
7    c     lu     88
8    c   chao     83
9    d     zc     99
10   d     lu     89
11   d  zhang     69

通过评论 1 编辑 1:

如果 score 列设置为 0,请尝试将参数 name='score' 添加到 reset_index()

df1 = df.set_index('name').groupby('cat')['score'].nlargest(3).reset_index(name='score')

另一个解决方案是rename:

df1 = df.set_index('name')
        .groupby('cat')['score']
        .nlargest(3)
        .reset_index()
        .rename(columns={'0':'score'})

如果有多个列,将它们添加到 set_index:

df1 = df.set_index(['name', 'name1', 'name2'])
        .groupby('cat')['score']
        .nlargest(3)
        .reset_index(name='score')