如何检查两个数据帧上分组项目的间隔重叠?
How to check for interval overlap for grouped item on two dataframes?
我有两个数据框,df1 和 df2,df1 有三列 - group、startdate1 和 enddate1,df2 也有三列,group、startdate2 和 enddate2。如果间隔 (startdate1,enddate1) 与同一组的任何间隔 (startdate2,enddate2) 重叠,我想比较 df1 中的每个组。
我发现这个 post() 使用 pandas.IntervalIndex.overlaps 检查间隔重叠。这与我的问题非常相似,但我正在努力研究如何将 groupby 用于 pandas.IntervalIndex.overlaps (或者我应该使用其他方法)?以下是一些示例数据:
df1:
group
startdate1
enddate1
A
2017-07-01
2018-06-30
B
2017-07-01
2018-06-30
A
2018-07-01
2019-06-30
B
2019-07-01
2020-06-30
df2:
group
startdate2
enddate2
A
2017-05-01
2018-04-30
A
2019-10-01
2020-01-31
B
2017-07-02
2018-06-29
B
2018-07-01
2019-06-30
如果同一组的 df2 有任何间隔重叠,预期的输出是在 df1 中添加一列 1 或 0。
df_output:
group
startdate1
enddate1
flag
A
2017-07-01
2018-06-30
1
B
2017-07-01
2018-06-30
1
A
2018-07-01
2019-06-30
0
B
2019-07-01
2020-06-30
0
谢谢!
您可以在组内进行笛卡尔连接,找到 df1
中按日期范围与 df2
重叠的记录索引,然后通过检查记录索引是否在该记录索引中来添加标志名单:
ixs = (df1.reset_index().merge(df2, on=['group'])
.query('(startdate1 < enddate2) & (enddate1 > startdate2)'))['index']
df1.assign(flag=df1.index.isin(ixs).astype(int))
输出:
group startdate1 enddate1 flag
0 A 2017-07-01 2018-06-30 1
1 B 2017-07-01 2018-06-30 1
2 A 2018-07-01 2019-06-30 0
3 B 2019-07-01 2020-06-30 0
P.S。我假设所有日期都已经是 datetime
格式,否则我们需要先 pd.to_datetime(...)
这些列
我有两个数据框,df1 和 df2,df1 有三列 - group、startdate1 和 enddate1,df2 也有三列,group、startdate2 和 enddate2。如果间隔 (startdate1,enddate1) 与同一组的任何间隔 (startdate2,enddate2) 重叠,我想比较 df1 中的每个组。
我发现这个 post(
df1:
group | startdate1 | enddate1 |
---|---|---|
A | 2017-07-01 | 2018-06-30 |
B | 2017-07-01 | 2018-06-30 |
A | 2018-07-01 | 2019-06-30 |
B | 2019-07-01 | 2020-06-30 |
df2:
group | startdate2 | enddate2 |
---|---|---|
A | 2017-05-01 | 2018-04-30 |
A | 2019-10-01 | 2020-01-31 |
B | 2017-07-02 | 2018-06-29 |
B | 2018-07-01 | 2019-06-30 |
如果同一组的 df2 有任何间隔重叠,预期的输出是在 df1 中添加一列 1 或 0。 df_output:
group | startdate1 | enddate1 | flag |
---|---|---|---|
A | 2017-07-01 | 2018-06-30 | 1 |
B | 2017-07-01 | 2018-06-30 | 1 |
A | 2018-07-01 | 2019-06-30 | 0 |
B | 2019-07-01 | 2020-06-30 | 0 |
谢谢!
您可以在组内进行笛卡尔连接,找到 df1
中按日期范围与 df2
重叠的记录索引,然后通过检查记录索引是否在该记录索引中来添加标志名单:
ixs = (df1.reset_index().merge(df2, on=['group'])
.query('(startdate1 < enddate2) & (enddate1 > startdate2)'))['index']
df1.assign(flag=df1.index.isin(ixs).astype(int))
输出:
group startdate1 enddate1 flag
0 A 2017-07-01 2018-06-30 1
1 B 2017-07-01 2018-06-30 1
2 A 2018-07-01 2019-06-30 0
3 B 2019-07-01 2020-06-30 0
P.S。我假设所有日期都已经是 datetime
格式,否则我们需要先 pd.to_datetime(...)
这些列