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分?显示所有三行
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=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
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)
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |