[英]Pandas drop duplicates but keep maximum value
我確信已經問過這個問題的變體,但我有一個非常具體的場景,我需要有效地執行。
想象一個 dataframe 如下所示:
日期 | 價值 | ID |
---|---|---|
2021-03-29 | 100 | 1 |
2021-03-29 | 50 | 1 |
2021-03-28 | 90 | 1 |
2021-03-28 | 100 | 1 |
2021-03-27 | 110 | 1 |
2021-03-29 | 100 | 2 |
2021-03-29 | 50 | 2 |
2021-03-28 | 90 | 2 |
2021-03-28 | 100 | 2 |
2021-03-27 | 110 | 2 |
您會注意到,在這個 dataframe 中,每個“id”都有重復的“日期”。 這是一個報告錯誤,所以我想做的是 go 通過每個“id”並完全刪除一個重復的日期行。
我想保留每個重復日期的版本,它具有更大的“價值”。
我理想的結果 dataframe 看起來像這樣:
日期 | 價值 | ID |
---|---|---|
2021-03-29 | 100 | 1 |
2021-03-28 | 100 | 1 |
2021-03-27 | 110 | 1 |
2021-03-29 | 100 | 2 |
2021-03-28 | 100 | 2 |
2021-03-27 | 110 | 2 |
我也在一個相對較大的數據集(約 250 萬條記錄)上執行此操作,因此我想找到一個相對較快的解決方案(比僅僅 for 循環和手動執行此操作更好)。
我建議按降序排序value
並使用drop_duplicates
刪除具有重復Date
和id
值的值。 第一個值(例如最高),將默認保留
df.sort_values("Value", ascending = False).drop_duplicates(subset=["Date", "id"], keep="first")
Date Value id
4 2021-03-27 110 1
9 2021-03-27 110 2
0 2021-03-29 100 1
3 2021-03-28 100 1
5 2021-03-29 100 2
8 2021-03-28 100 2
如果需要,您可以通過將.sort_values(["id", "Date"])
鏈接到末尾來重新排序以獲得所需 output 的排序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.