我有两个表:一个是计划泄漏补丁的表,另一个是泄漏补丁的实现表。如下:
第二个表有更多列(这里省略)。这里的情况是我可以使用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加入使用了密钥。
非常感谢提前
答案 0 :(得分:0)
有六种情况可以相交或不相交。您已经记录了四种情况,另外两种情况是REAL完全在PLAN之前。可以通过说明REAL.REAL_END&lt;的位置来测试这种情况。 PLAN.INTERVAL_START,另一个条件是在PLAN之后REAL完成的地方。可以通过说明何时REAL.REAL_START&gt;来测试这种情况。 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