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

如何基于多列正则匹配规则实现pandas表格合并

Pandas按两列正则匹配合并DataFrame实现方法

实现思路

先将两个DataFrame做笛卡尔积得到所有行的两两组合,再筛选出同时满足a列正则匹配、b列正则匹配的行,最终整理得到目标结果。


步骤1:导入依赖与定义示例数据

import pandas as pd

# 定义df1
df1 = pd.DataFrame({'a': ['foo', 'bar','zoolo','foo','foo'], 'b': ['tty','abc', 'uhg','abc','tty'], 'c':[14,72,93,33,57]})
# 定义df2
df2 = pd.DataFrame({'a': ['zool(o|r)','foo|oof','[badr]+'],'b': ['uh(f|g)','[ty]+','abc|bac'], 'j': [11,32,65]})

步骤2:核心实现代码

# 1. 交叉合并(笛卡尔积)得到所有行组合,pandas1.2.0+支持how='cross'
cross_df = df1.merge(df2, how='cross', suffixes=('_df1', '_df2'))

# 低版本pandas兼容写法,替换上面交叉合并代码即可
# cross_df = df1.assign(tmp_key=1).merge(df2.assign(tmp_key=1), on='tmp_key').drop('tmp_key', axis=1)

# 2. 筛选同时满足a列、b列全量正则匹配的行
match_mask = (
    cross_df.apply(lambda x: bool(str.fullmatch(x['a_df2'], x['a_df1'])), axis=1)
    & cross_df.apply(lambda x: bool(str.fullmatch(x['b_df2'], x['b_df1'])), axis=1)
)

# 3. 整理列顺序、重置索引得到最终结果df3
df3 = cross_df[match_mask][['a_df1', 'b_df1', 'c', 'j']].rename(columns={'a_df1':'a', 'b_df1':'b'}).reset_index(drop=True)

结果验证

输出df3即可得到预期结果:

索引abcj
0footty1432
1barabc7265
2zoolouhg9311
3footty5732

内容的提问来源于stack exchange,提问作者jadeidev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:18:03