猿问

在左连接中使用类似 SQL 的连接和过滤器 (Between) 合并表

所以我有这两个表,我想在其中做 aleft join并过滤我的date列来自和列df1之间的行。 fromtodf2


注意row 6哪个没有ClockInDate哪个最终会导致问题。


df1:


  Company Resource ClockInDate

0       A     ResA  2019-02-09

1       A     ResB  2019-02-09

2       A     ResC  2019-02-09

3       B     ResD  2019-02-09

4       B     ResE  2019-02-09

5       B     ResF  2019-02-09

6       B     ResG         NaT

df2:


  Company Resource EffectiveFrom EffectiveTo

0       A     ResA    2018-01-01  2018-12-31

1       A     ResA    2019-01-01  2099-12-31

2       A     ResB    2018-01-01  2018-12-31

3       A     ResB    2019-01-01  2099-12-31

4       B     ResE    2018-01-01  2018-12-31

5       B     ResE    2019-01-01  2099-12-31

6       B     ResF    2018-01-01  2018-12-31

7       B     ResF    2019-01-01  2099-12-31

8       B     ResG    2018-01-01  2018-12-31

9       B     ResG    2019-01-01  2099-12-31

我想我可以left merge在熊猫中做到这一点,然后应用过滤器。

但它给出了不同的输出。


因此,在 SQL 中,您可以ON像这样在子句中包含此过滤器,但这与在WHERE子句中的 join 之后包含此过滤器不同:


       SELECT t1.company,

              t1.resource,

              t2.company,

              t2.resource,

              t1.ClockInDate,

              t2.EffectiveFrom,

              t2.EffectiveTo

       FROM table1 t1

       LEFT JOIN table2 t2 ON t1.resource = t2.resource

                            AND t1.company = t2.company

                            AND t1.ClockInDate BETWEEN t2.EffectiveFrom AND t2.EffectiveTo

注意部分:AND t1.ClockInDate BETWEEN t2.EffectiveFrom AND t2.EffectiveTo

注意:在 SQL 代码中df1是t1和df2是t2



桃花长相依
浏览 168回答 2
2回答

翻翻过去那场雪

所以在完成这个项目后,我获得了更多的见识。我找到了一个解决方案,但希望有cleaner一个解决方案。但这有效:我们可以连接来自原始数据帧的行,这些行具有ClockIndate.isnull:df_merge = pd.merge(df1, df2, on=['Company', 'Resource'], how='left')df_filter = df_merge[df_merge.ClockInDate.between(df_merge.EffectiveFrom, df_merge.EffectiveTo) | df_merge.EffectiveFrom.isnull()]df_final = pd.concat([df_filter, df1[df1.ClockInDate.isnull()]], sort=True)print(df_final)  ClockInDate Company EffectiveFrom EffectiveTo Resource1  2019-02-09       A    2019-01-01  2099-12-31     ResA3  2019-02-09       A    2019-01-01  2099-12-31     ResB4  2019-02-09       A           NaT         NaT     ResC5  2019-02-09       B           NaT         NaT     ResD7  2019-02-09       B    2019-01-01  2099-12-31     ResE9  2019-02-09       B    2019-01-01  2099-12-31     ResF6         NaT       B           NaT         NaT     ResG
随时随地看视频慕课网APP

相关分类

Python
我要回答