Преобразование внешнего интервала SQL в Python Pandas Dataframe - PullRequest
1 голос
/ 16 июня 2019

Я преобразую соединение Oracle с внешним интервалом в Pandas Dataframe.Ниже приведен Oracle SQL:

WITH df_interval AS
          (SELECT '1' id,
                     'AAA' interval,
                     1000 begin,
                     2000 end
              FROM DUAL
            UNION ALL
            SELECT '1' id,
                     'BBB' intrvl,
                     2100 begin,
                     3000 end
              FROM DUAL
            UNION ALL
            SELECT '2' id,
                     'CCC' intrvl,
                     3100 begin,
                     4000 end
              FROM DUAL
            UNION ALL
            SELECT '2' id,
                     'DDD' intrvl,
                     4100 begin,
                     5000 end
              FROM DUAL),
      df_point AS
          (SELECT '1' id, 'X1' point, 1100 mid FROM DUAL
            UNION ALL
            SELECT '1' id, 'X2' point, 2050 mid FROM DUAL
            UNION ALL
            SELECT '1' id, 'X3' point, 3200 mid FROM DUAL
            UNION ALL
            SELECT '2' id, 'X4' point, 4200 mid FROM DUAL
            UNION ALL
            SELECT '2' id, 'X5' point, 5500 mid FROM DUAL)
SELECT pt.id,
         point,
         mid,
         interval
  FROM df_interval it RIGHT OUTER JOIN df_point pt ON pt.id = it.id AND pt.mid BETWEEN it.begin AND it.end

Я пытался создать кадры данных, но я не могу присоединиться как «RIGHT OUTER JOIN интервал», как указано выше Oracle SQL:

import pandas as pd
df_interval = pd.DataFrame({
                   'ID':['1','1','2','2'],
                   'interval': ['AAA', 'BBB', 'CCC', 'DDD'],
                   'begin': [1000,2100,3100,4100],
                   'end': [2000, 3000,4000,5000]})

df_point = pd.DataFrame({
                   'ID':['1','1','1','2','2'],
                   'point': ['X1', 'X2', 'X3', 'X4','X5'],
                   'mid': [1100,2050,3200,4200,5500]})

Я ожидаю, что результат будет примерно таким:

df_out = pd.DataFrame({
                   'ID':['1','1','1','2','2'],
                   'mid': [1100,2050,3200,4200,5500],
                   'intrvl':['AAA','','','DDD','']})

Оцените, кто-нибудь может помочь мне в этом?

1 Ответ

0 голосов
/ 16 июня 2019

Я чувствую, что merge_asof идеально подходит для вашего случая, только по-другому, нам нужно сделать два раза, когда и результат слияния конца и начала совпадают, этот интервал должен быть согласованным

s1=pd.merge_asof(df_point,df_interval,by='ID',left_on='mid',right_on='end',direction='forward')
s2=pd.merge_asof(df_point,df_interval,by='ID',left_on='mid',right_on='begin',direction='backward')
s1.interval=s1.interval.where(s1.interval==s2.interval)
s1.drop(['end','begin'],1,inplace=True)
s1
  ID point   mid interval
0  1    X1  1100      AAA
1  1    X2  2050      NaN
2  1    X3  3200      NaN
3  2    X4  4200      DDD
4  2    X5  5500      NaN
...