[英]Select all rows with 2 most recent dates by ID
我想按每個 ID 選擇具有 2 個最近日期的所有行。 每個 ID 的 Max 和 Max-1 日期和行數可能因 ID 而異。
示例數據:
data = {'id': np.repeat((['a','b','c']), 6),
'date': ['2020-12-07', '2020-12-07','2020-12-05','2020-12-05','2020-12-04','2020-12-04',
'2021-12-07', '2021-12-07','2021-09-05','2021-09-05','2021-05-04','2021-05-04',
'2021-09-05', '2021-09-05','2021-02-05','2021-02-05','2020-12-04','2020-12-04'],
'value1': np.repeat(([10,20,30]), 6),
'value2': np.repeat(([1000,2000,3000]), 6)
}
df = pd.DataFrame(data)
期望的輸出:
id date value1 value2
0 a 2020-12-07 10 1000
1 a 2020-12-07 10 1000
2 a 2020-12-05 10 1000
3 a 2020-12-05 10 1000
4 b 2021-12-07 20 2000
5 b 2021-12-07 20 2000
6 b 2021-09-05 20 2000
7 b 2021-09-05 20 2000
8 c 2021-09-05 30 3000
9 c 2021-09-05 30 3000
10 c 2021-02-05 30 3000
11 c 2021-02-05 30 3000
我讀過.nlargest()
可以拉出最后兩個日期,但是我很難找到將它應用於我的用例並在我的 df 中維護其他值的方法。
您可以嘗試groupby().nth
:
df[df['date']>=df.groupby("id")["date"].transform('nth', n=2)]
輸出:
id date value1 value2
0 a 2020-12-07 10 1000
1 a 2020-12-07 10 1000
2 a 2020-12-05 10 1000
3 a 2020-12-05 10 1000
6 b 2021-12-07 20 2000
7 b 2021-12-07 20 2000
8 b 2021-09-05 20 2000
9 b 2021-09-05 20 2000
12 c 2021-09-05 30 3000
13 c 2021-09-05 30 3000
14 c 2021-02-05 30 3000
15 c 2021-02-05 30 3000
您可以嘗試使用“密集”排名:
>>> df[df.groupby("id")["date"].transform(pd.Series.rank, ascending=False, method="dense")<=2]
id date value1 value2
0 a 2020-12-07 10 1000
1 a 2020-12-07 10 1000
2 a 2020-12-05 10 1000
3 a 2020-12-05 10 1000
6 b 2021-12-07 20 2000
7 b 2021-12-07 20 2000
8 b 2021-09-05 20 2000
9 b 2021-09-05 20 2000
12 c 2021-09-05 30 3000
13 c 2021-09-05 30 3000
14 c 2021-02-05 30 3000
15 c 2021-02-05 30 3000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.