根据条件时间范围过滤每个 ID 的数据帧
Filter dataframe per ID based on conditional timerange
您好,我会尝试解释我面临的问题。
我有一个数据框 (df) 包含以下内容:
ID
Date (dd-mm-yyyy)
AAA
01-09-2020
AAA
01-11-2020
AAA
18-03-2021
AAA
10-10-2022
BBB
01-01-2019
BBB
01-03-2019
CCC
01-05-2020
CCC
01-07-2020
CCC
01-08-2020
CCC
01-10-2021
我创建了另一个数据框 (df2),每个 ID 注册的第一个日期 (t) 和 t+3 个月:
ID
T (First Date Occurred)
T+3
AAA
01-09-2020
01-12-2020
BBB
01-01-2019
01-03-2020
CCC
01-05-2020
01-08-2020
我苦苦挣扎的期望输出是根据 df2("T" & "T+3):
中定义的两个日期过滤器过滤 df
e.g.AAA = AAA > T & AAA < T+3
ID
Date (dd-mm-yyyy)
AAA
01-11-2020
BBB
01-03-2019
CCC
01-07-2020
CCC
01-08-2020
解决这个问题的最佳方法是什么?感谢您的帮助!
IIUC,你可以使用 pandas.merge_asof
和 allow_exact_matches=False
:
(pd.merge_asof(df1.sort_values(by='Date'), df2.sort_values(by='T'),
allow_exact_matches=False,
by='ID', left_on='Date', right_on='T')
.loc[lambda d: d['Date'] <= d['T+3']]
)
注意。 T+3 的确切条件不清楚,因为你描述了“< T+3”,但显示的输出有“<= T+3”,只需在 loc
中选择你想要的(< 或 <=)
输出:
ID Date T T+3
1 BBB 2019-03-01 2019-01-01 2020-03-01
3 CCC 2020-07-01 2020-05-01 2020-08-01
4 CCC 2020-08-01 2020-05-01 2020-08-01
6 AAA 2020-11-01 2020-09-01 2020-12-01
您好,我会尝试解释我面临的问题。
我有一个数据框 (df) 包含以下内容:
ID | Date (dd-mm-yyyy) |
---|---|
AAA | 01-09-2020 |
AAA | 01-11-2020 |
AAA | 18-03-2021 |
AAA | 10-10-2022 |
BBB | 01-01-2019 |
BBB | 01-03-2019 |
CCC | 01-05-2020 |
CCC | 01-07-2020 |
CCC | 01-08-2020 |
CCC | 01-10-2021 |
我创建了另一个数据框 (df2),每个 ID 注册的第一个日期 (t) 和 t+3 个月:
ID | T (First Date Occurred) | T+3 |
---|---|---|
AAA | 01-09-2020 | 01-12-2020 |
BBB | 01-01-2019 | 01-03-2020 |
CCC | 01-05-2020 | 01-08-2020 |
我苦苦挣扎的期望输出是根据 df2("T" & "T+3):
中定义的两个日期过滤器过滤 dfe.g.AAA = AAA > T & AAA < T+3
ID | Date (dd-mm-yyyy) |
---|---|
AAA | 01-11-2020 |
BBB | 01-03-2019 |
CCC | 01-07-2020 |
CCC | 01-08-2020 |
解决这个问题的最佳方法是什么?感谢您的帮助!
IIUC,你可以使用 pandas.merge_asof
和 allow_exact_matches=False
:
(pd.merge_asof(df1.sort_values(by='Date'), df2.sort_values(by='T'),
allow_exact_matches=False,
by='ID', left_on='Date', right_on='T')
.loc[lambda d: d['Date'] <= d['T+3']]
)
注意。 T+3 的确切条件不清楚,因为你描述了“< T+3”,但显示的输出有“<= T+3”,只需在 loc
中选择你想要的(< 或 <=)
输出:
ID Date T T+3
1 BBB 2019-03-01 2019-01-01 2020-03-01
3 CCC 2020-07-01 2020-05-01 2020-08-01
4 CCC 2020-08-01 2020-05-01 2020-08-01
6 AAA 2020-11-01 2020-09-01 2020-12-01