簡體   English   中英

Python:過濾pandas數據幀以保持基於列的指定行數

[英]Python: filter pandas dataframe to keep specified number of rows based on a column

我有一個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接受的答案在大型數據幀上運行得更好,這就是為什么我要堅持它作為答案。

使用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

我們可以在第一行的排序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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM