Python:过滤pandas数据帧以根据列

时间:2018-02-01 20:07:23

标签: python pandas

我有一个pandas数据框,如下所示:

id    name    grade
1     A       10
1     A       12
1     A       15
2     B       20
3     C       19
3     C       16
3     C       11

需要让它看起来像:

id    name    grade
1     A       12
1     A       15
2     B       20
3     C       19
3     C       16

在这种情况下,我需要为每个ID保持前2行,并且成绩最高。我知道我可以使用iloc并遍历数据帧,但我想知道是否有更多的pythonic方法。这有可能吗?提前致谢

顺便说一下,如果您有任何想法,请随时编辑问题,并给它一个更好的标题。

UPDATE1 我已经接受了@ willem-van-onsem的答案,因为它是先发布的,对我来说效果很好。另一个答案也很好。我不确定每个答案的表现,所以如果出于任何原因你认为另一个可能更合适,请在这里发表评论,以便我更新答案和帖子以及其他人。

UPDATE2 接受的答案在大型数据框架上效果更好,这就是为什么我会坚持这样做的答案。

2 个答案:

答案 0 :(得分:3)

使用nlargest

df.loc[df.groupby('id').grade.nlargest(2).index.get_level_values(1)].sort_index()

    id  name    grade
1   1   A       12
2   1   A       15
3   2   B       20
4   3   C       19
5   3   C       16

答案 1 :(得分:2)

我们可以先对name(升序)和grade(降序)的行进行排序(严格按名称排序),然后我们groupby name ,然后我们得到前两行(head):

df.sort_values(['name', 'grade'], ascending=[True, False]).groupby('name').head(2)

这将产生:

>>> df.sort_values(['name', 'grade'], ascending=[True, False]).groupby('name').head(2)
   grade  id name
2     15   1    A
1     12   1    A
3     20   2    B
4     19   3    C
5     16   3    C