pandas 获取每个类别的最多 3 个分数行
pandas get the max 3 score rows for each category
我得到如下列表:
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')
另一个解决方案是rename
:
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')
我得到如下列表:
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')
另一个解决方案是rename
:
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')