![](/img/trans.png)
[英]Filter pandas dataframe based on a column: keep all rows if a value is that column
[英]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.