根据间隔加入/合并Dataframe

时间:2018-02-12 03:52:26

标签: python sql pandas dataframe join

我有两个表:一个是计划泄漏补丁的表,另一个是泄漏补丁的实现表。如下: enter image description here

第二个表有更多列(这里省略)。这里的情况是我可以使用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

条件的情况是否足以满足下面的描述,并确保显示的数据仅在两个表之间的间隔有交叉时才显示。Intersection Cases

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

非常感谢提前

1 个答案:

答案 0 :(得分:0)

有六种情况可以相交或不相交。您已经记录了四种情况,另外两种情况是REAL完全在PLAN之前。可以通过说明REAL.REAL_END&lt;的位置来测试这种情况。 PLAN.INTERVAL_START,另一个条件是在PLAN之后REAL完成的地方。可以通过说明何时REAL.REAL_START&gt;来测试这种情况。 PLAN.INTERVAL_END。

enter image description here enter image description here

因此,您可以简单地使用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