pandas获得每个类别的最多3个分数行

时间:2016-06-28 13:00:52

标签: python pandas dataframe group-by greatest-n-per-group

我得到如下列表:

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分行?显示所有三行

1 个答案:

答案 0 :(得分:4)

您可以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的{​​{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

评论1的EDIT1:

如果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 列设置为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