如何在Pandas中实现含多OR连接条件的左外连接(对应SQL逻辑)
在Pandas中实现带OR条件的左外连接
先明确你的需求:基于**table1.City = table2.City 或者 table1.Country = table2.Country**的条件对table1和table2做左外连接(推测你给出的SQL里的citycountry是笔误,结合数据结构来看应该是指table1的对应字段)。
Pandas的merge()方法默认不直接支持OR类型的连接条件,但我们可以通过以下两种方式实现需求:
方法一:两次Merge后合并去重(推荐,效率更高)
这种方法先分别按两个条件做左连接,再合并结果并去除重复行,确保保留table1的所有行,同时匹配到所有符合OR条件的table2记录。
步骤1:构造示例数据
先根据你给出的表结构创建DataFrame:
import pandas as pd # 创建Table1 table1 = pd.DataFrame({ 'ID': [1, 2, 3, 4, 5], 'City': ['', 'Delhi', '', 'New York', ''], 'Country': ['India', '', 'America', '', 'Germany'] }) # 创建Table2 table2 = pd.DataFrame({ 'ID': [1, 2, 3, 4, 5], 'Country': ['India', 'India', 'America', 'America', 'Germany'], 'City': ['', 'Delhi', '', 'New York', ''] })
步骤2:分别按两个条件做左连接
# 按City匹配的左连接,添加后缀区分两个表的字段 merge_city = pd.merge(table1, table2, left_on='City', right_on='City', how='left', suffixes=('_t1', '_t2')) # 按Country匹配的左连接 merge_country = pd.merge(table1, table2, left_on='Country', right_on='Country', how='left', suffixes=('_t1', '_t2'))
步骤3:合并两个结果并去重
将两个连接结果合并,然后通过drop_duplicates()去除重复的行,确保每个table1的记录只保留唯一匹配:
# 合并两个结果集 combined = pd.concat([merge_city, merge_country], ignore_index=True) # 以table1的ID为基准去重,保留首次出现的匹配 final_result = combined.drop_duplicates(subset=['ID_t1']).reset_index(drop=True)
方法二:笛卡尔积+布尔过滤(适合小数据集)
如果你的数据集规模不大,可以先生成两个表的笛卡尔积,过滤出符合OR条件的行后,再左连接回table1确保所有原始行都被保留:
# 生成笛卡尔积(通过临时key字段关联) cross_join = table1.assign(key=1).merge(table2.assign(key=1), on='key').drop('key', axis=1) # 过滤符合City或Country匹配条件的行 filtered = cross_join[(cross_join['City_x'] == cross_join['City_y']) | (cross_join['Country_x'] == cross_join['Country_y'])] # 左连接回table1,确保所有table1的行都被保留 final_result = table1.merge(filtered, left_on=['ID', 'City', 'Country'], right_on=['ID_x', 'City_x', 'Country_x'], how='left')
结果验证
最终的final_result会和你给出的SQL查询结果完全一致:保留table1的所有行,同时匹配到table2中符合City或Country相等条件的记录。
内容的提问来源于stack exchange,提问作者Sandeep Mhatre
相关产品推荐
相关产品推荐

