簡體   English   中英

按 ID 選擇具有 2 個最近日期的所有行

[英]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.

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