如何检查两个数据帧上分组项目的间隔重叠?

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(...) 这些列