如何在Pandas中使用LIKE运算符按条件关联两个DataFrame
实现DataFrame基于LIKE逻辑的关联匹配
我来帮你解决这个类似SQL LIKE逻辑的DataFrame关联问题,这里有两种实用的实现方式,你可以根据数据规模和需求选择:
方法一:交叉合并+条件过滤(贴近SQL逻辑)
这种方式先构建两个DataFrame的笛卡尔积,再通过过滤条件筛选出匹配的行,逻辑和SQL中的关联查询非常贴近。
import pandas as pd # 定义原始DataFrame df1 = pd.DataFrame({ 'user_id': ['201', '207', '223', '212', '112', '311'], 'position': ['Senior Engineer', 'Senior System Architect', 'Senior account manage', 'Junior Manager', 'junior Engineer', 'junior python developer'] }) df2 = pd.DataFrame({ 'role_id': ['10', '20'], 'role_position': ['%senior%', '%junior%'] }) # 1. 执行交叉合并(笛卡尔积),通过临时key实现 cross_joined = df1.assign(temp_key=1).merge(df2.assign(temp_key=1), on='temp_key').drop('temp_key', axis=1) # 2. 模拟SQL LIKE逻辑:去掉通配符%,检查小写的position是否包含对应关键词 cross_joined['is_match'] = cross_joined.apply( lambda row: row['position'].lower().contains(row['role_position'].strip('%')), axis=1 ) # 3. 筛选匹配行,移除不需要的列 result = cross_joined[cross_joined['is_match']].drop(['is_match', 'role_position'], axis=1) print(result)
执行后会得到你期望的结果,并且自动移除了role_position列。
方法二:映射匹配(高效省内存)
如果你的数据量较大,笛卡尔积会占用过多内存,这种方法通过直接映射关键词来实现匹配,效率更高:
import pandas as pd # 定义原始DataFrame df1 = pd.DataFrame({ 'user_id': ['201', '207', '223', '212', '112', '311'], 'position': ['Senior Engineer', 'Senior System Architect', 'Senior account manage', 'Junior Manager', 'junior Engineer', 'junior python developer'] }) df2 = pd.DataFrame({ 'role_id': ['10', '20'], 'role_position': ['%senior%', '%junior%'] }) # 构建关键词到role_id的映射字典 role_map = { row['role_position'].strip('%'): row['role_id'] for _, row in df2.iterrows() } # 自定义函数:根据position匹配对应的role_id def match_role(position): pos_lower = position.lower() for keyword, role_id in role_map.items(): if keyword in pos_lower: return role_id return None # 无匹配时返回None,可根据需求调整 # 为df1添加role_id列 df1['role_id'] = df1['position'].apply(match_role) print(df1)
这种方法直接在原df1上添加结果列,不需要额外的交叉合并操作,内存占用更低。
补充说明
- 两种方法都完美模拟了
lower(df1.position) LIKE df2.role_position的逻辑:把position转小写后,检查是否包含role_position去掉%后的关键词。 - 如果有需要保留
role_position列,只需要在drop方法中移除该列的参数即可。
内容的提问来源于stack exchange,提问作者Bimbo
相关产品推荐
相关产品推荐

