如何通过正则表达式快速合并两个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
相关产品推荐
相关产品推荐

