Вы можете использовать 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
и удалить level=1
из Multiindex
:
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
EDIT1 по comment1:
Если 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'})
я f имеют несколько столбцов, добавьте их в set_index
:
df1 = df.set_index(['name', 'name1', 'name2'])
.groupby('cat')['score']
.nlargest(3)
.reset_index(name='score')
спасибо, можем ли мы показать его как поле данных? –
см. Редактирование, я добавляю вывод в 'df1' – jezrael
спасибо, я попробовал, но« оценка »показала« 0 », что случилось? –