大熊猫获得每个类别的最高3分

liu*_*ang 1 python group-by greatest-n-per-group dataframe pandas

我得到如下列表:

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
Run Code Online (Sandbox Code Playgroud)

如何使用大熊猫获得每只猫的最高3分?显示所有三行

jez*_*ael 5

你可以用groupbynlargest

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
Run Code Online (Sandbox Code Playgroud)

如果需要reset_index和删除level=1Multiindex

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
Run Code Online (Sandbox Code Playgroud)

通过评论编辑:

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
Run Code Online (Sandbox Code Playgroud)

EDIT1通过comment1:

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

df1 = df.set_index('name').groupby('cat')['score'].nlargest(3).reset_index(name='score')
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是rename

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

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

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