【问题标题】:How to check for interval overlap for grouped item on two dataframes?如何检查两个数据帧上分组项目的间隔重叠?
【发布时间】:2021-05-31 10:37:49
【问题描述】:

我有两个数据框,df1 和 df2,df1 有三列 - group、startdate1 和 enddate1,df2 也有三列,group、startdate2 和 enddate2。我想比较 df1 中的每个组,如果间隔 (startdate1,enddate1) 与同一组的任何间隔 (startdate2,enddate2) 重叠。

我发现这篇文章 (Is it possible to use Pandas Overlap in a Dataframe?) 使用 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

谢谢!

【问题讨论】:

    标签: python pandas dataframe overlap


    【解决方案1】:

    您可以在组内进行笛卡尔连接,查找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
    

    附:我假设所有日期都是datetime 格式,否则我们需要先pd.to_datetime(...) 这些列

    【讨论】:

    • @ShubhamSharma 非常好的一点!更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多