我得到如下列表:
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 行的分数?显示所有三行
请您参考如下方法:
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')
