为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

桃花长相依 2021-11-02 17:03:15
所以我有这两个表,我想在其中做 aleft join并过滤我的date列来自和列df1之间的行。 fromtodf2注意row 6哪个没有ClockInDate哪个最终会导致问题。df1:  Company Resource ClockInDate0       A     ResA  2019-02-091       A     ResB  2019-02-092       A     ResC  2019-02-093       B     ResD  2019-02-094       B     ResE  2019-02-095       B     ResF  2019-02-096       B     ResG         NaTdf2:  Company Resource EffectiveFrom EffectiveTo0       A     ResA    2018-01-01  2018-12-311       A     ResA    2019-01-01  2099-12-312       A     ResB    2018-01-01  2018-12-313       A     ResB    2019-01-01  2099-12-314       B     ResE    2018-01-01  2018-12-315       B     ResE    2019-01-01  2099-12-316       B     ResF    2018-01-01  2018-12-317       B     ResF    2019-01-01  2099-12-318       B     ResG    2018-01-01  2018-12-319       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
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

所以在完成这个项目后,我获得了更多的见识。我找到了一个解决方案,但希望有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 Resource

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

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

4  2019-02-09       A           NaT         NaT     ResC

5  2019-02-09       B           NaT         NaT     ResD

7  2019-02-09       B    2019-01-01  2099-12-31     ResE

9  2019-02-09       B    2019-01-01  2099-12-31     ResF

6         NaT       B           NaT         NaT     ResG


查看完整回答
反对 回复 2021-11-02
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信