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

如何通过正则表达式快速合并两个Pandas表格?

在Python中使用正则表达式合并两个Pandas表格的快速方法

当然有办法实现这种基于正则匹配的关联合并!下面我就用你给出的示例场景,一步步演示具体的操作步骤,保证清晰易懂。

首先,我们先构建示例中的两个表格:

import pandas as pd
import re
import numpy as np

# 构建Table A
df_a = pd.DataFrame({
    'col1': [1, 2, 1, 1],
    'col2': ['apple_3dollars_5', 'apple_2dollar_4', 'orange_5dollar_3', 'apple_1dollar_3']
})

# 构建Table B
df_b = pd.DataFrame({
    'col1': ['good', 'bad', 'ok'],
    'col2': ['(apple|orange)_\\dollars_5', '.*_1dollar_.*', 'orange_\\ddollar_\\d']
})

方法一:逐行匹配(适合小数据集)

我们可以定义一个匹配函数,遍历Table B的正则规则,为Table A的每一行找到对应的匹配结果:

def get_match_label(text):
    # 遍历Table B的所有正则规则
    for _, rule_row in df_b.iterrows():
        # 检查当前文本是否匹配正则
        if pd.Series(text).str.match(rule_row['col2']).iloc[0]:
            return rule_row['col1']
    return None  # 无匹配时返回空值

# 给Table A添加匹配结果列
df_a['col3'] = df_a['col2'].apply(get_match_label)

# 过滤掉无匹配的行,得到最终结果
final_df = df_a.dropna(subset=['col3']).reset_index(drop=True)

print(final_df)

运行后输出:

col1              col2  col3
0     1  apple_3dollars_5  good
1     1   orange_5dollar_3    ok
2     1    apple_1dollar_3   bad

方法二:向量化匹配(适合大数据集)

如果你的表格数据量较大,逐行遍历的效率会偏低,这时可以用np.select实现向量化匹配,速度会快很多:

# 提前编译所有正则表达式,提升匹配效率
compiled_patterns = [re.compile(pattern) for pattern in df_b['col2']]

# 生成每个正则对应的匹配条件
match_conditions = [df_a['col2'].str.match(pat) for pat in compiled_patterns]

# 用np.select批量匹配,返回对应的标签
df_a['col3'] = np.select(match_conditions, df_b['col1'].tolist(), default=None)

# 过滤无匹配行
final_df = df_a.dropna(subset=['col3']).reset_index(drop=True)

这个方法的逻辑和第一种一致,但通过向量化操作避免了逐行循环,处理大数据集时优势明显。

注意事项

  • 正则表达式中的转义字符要注意:比如示例中的\d和\$,在Python字符串中需要写成\\d和\\$,或者直接用原始字符串(比如r'(apple|orange)_\$dollars_5'),这样能避免转义错误。
  • 如果存在多个正则规则匹配同一个字符串,两种方法都会返回第一个匹配到的规则对应的标签,和你示例中的逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:34:46