【问题标题】:Join/Merge Dataframe based on interval根据间隔加入/合并数据框
【发布时间】:2018-07-22 04:47:08
【问题描述】:

我有两张表:一张是计划泄漏补丁表,另一张是泄漏补丁实现表。如下:

第二个表有更多的列(这里省略)。这里的情况是我可以使用 SQL 表达式连接这两个表,如下所示:

SELECT
    PLAN.PIPE_ID,
    PLAN.INTERVAL_START,
    PLAN.INTERVAL_END,
    REAL.REAL_START,
    REAL.REAL_END,
    ...
FROM PLAN, REAL
WHERE
    PLAN.PIPE_ID=REAL.PIPE_ID
    REAL_START<INTERVAL_END AND
    REAL_END>INTERVAL_START AND
    ((REAL_START>=INTERVAL_START AND REAL_END<=INTERVAL_END) OR --CASE 1
    (REAL_START>=INTERVAL_START AND REAL_START>INTERVAL_END) OR --CASE 2
    (REAL_START<INTERVAL_START AND REAL_START<=INTERVAL_END) OR --CASE 3
    (REAL_START<INTERVAL_START AND REAL_START>INTERVAL_END)) --CASE 4

其中条件的情况满足下面的描述,并确保显示的数据只有两个表之间的间隔有交集。

如果我要使用 Pandas 进行相同的连接。怎么做?我是 pandas 的新手,我了解到 Pandas 加入使用密钥。

在此先感谢

【问题讨论】:

    标签: python sql pandas dataframe join


    【解决方案1】:

    范围可以相交或不相交有六种情况。您已经记录了四种情况,另外两种情况是 REAL 完全在 PLAN 之前。这个条件可以通过说明 where REAL.REAL_END PLAN.INTERVAL_END 来测试此条件。

    因此,您可以简单地使用 SQL 查询来检查这两个条件,如果两者都不成立,那么您有相交的范围。在 pandas 中,您可以使用以下内容,与您在 SQL 中所做的非常相似,进行交叉连接并过滤结果:

    import pandas as pd
    import numpy as np
    
    plan = pd.DataFrame({'PIPE_ID':['P_01','P_01'],'INTERVAL_START':[150,175],'INTERVAL_END':[151.5,177.5]})
    
    real  = pd.DataFrame({'PIPE_ID':['P_01','P_01'],'REAL_START':[148,174.5],'REAL_END':[150.5,178]})
    
    df_merged = plan.merge(real, on='PIPE_ID')
    
    df_out = df_merged[~((df_merged['REAL_END'] < df_merged['INTERVAL_START']) | (df_merged['REAL_START']>df_merged['INTERVAL_END']))] 
    
    print(df_out)
    

    输出:

       INTERVAL_END  INTERVAL_START PIPE_ID  REAL_END  REAL_START
    0         151.5             150    P_01     150.5       148.0
    3         177.5             175    P_01     178.0       174.5
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2016-07-29
      • 2019-01-13
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多