Skip to main content
 首页 » 编程设计

python之pandas 获得每个类别的最多 3 个分数行

2025年05月04日27kerrycode

我得到如下列表:

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与 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并删除 Multiindex 的 level=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') 

另一种解决方案是重命名:

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')