You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现类似SQL ON子句带多条件的左连接

如何在Pandas中实现类似SQL ON子句带多条件的左连接

我明白你的问题啦!你当前遇到的核心差异是:SQL里的LEFT JOIN在ON子句中添加额外条件时,是先筛选出t2中符合条件的行再和t1连接,并且会保留t1中所有没有匹配到t2的行;而你现在的Pandas代码是先把t1和t2按key全量左连接,再过滤条件,这会把t1中那些虽然key匹配但不满足x2/y2条件的行,以及完全没有匹配到t2的行都删掉,结果自然和SQL逻辑不一致。

给你两种可行的解决方案,都能精准还原SQL的效果:

方案一:先筛选符合条件的匹配关系再左连接

这种方法先通过交叉合并找到所有满足key匹配+额外条件的行,再和t1左连接,能减少后续合并的数据量,适合数据规模较大的场景:

# 先获取所有满足连接条件的(key, x, y)与t2的匹配对
matched_pairs = t1[['key', 'x', 'y']].merge(t2, on='key')
matched_pairs = matched_pairs[(matched_pairs['x2'] <= matched_pairs['x']) & (matched_pairs['y2'] > matched_pairs['y'])]

# 再用t1和筛选后的匹配对左连接,保留t1所有行
df = t1.merge(matched_pairs, on=['key', 'x', 'y'], how='left')

方案二:全量左连接后保留符合条件的行(含无匹配的t1行)

如果你更习惯先完成全量左连接再调整结果,可以用这种方式:

# 先执行全量左连接
df = t1.merge(t2, how='left', on='key')

# 筛选条件:要么是t2无匹配(x2为NaN),要么满足x2<=x且y2>y
condition = df['x2'].isna() | ((df['x2'] <= df['x']) & (df['y2'] > df['y']))
df = df[condition]

这两种方法都能实现和你给出的SQL完全一致的结果,你可以根据自己的数据情况选择更合适的方式。

备注:内容来源于stack exchange,提问作者BD1903

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:59:29