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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:57:48