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

基于字符串包含关系合并两个Pandas DataFrame(非迭代实现)

Pandas高效匹配合并两个DataFrame的方案

核心思路

利用A和C中字符串顺序一致的关键条件,避开低效的全量交叉匹配,用Pandas向量化操作替代迭代器,大幅提升处理速度。

方案一:正则提取匹配(最简洁)

适用于A的content无正则特殊字符(或可转义)的场景:

  1. 转义A的content避免正则语法冲突
  2. 用正则从C的data.data中提取匹配的content
  3. 按匹配内容合并两个DataFrame
import pandas as pd
import re

# 转义A的content,避免正则特殊字符干扰
A['content_escaped'] = A['content'].apply(re.escape)
# 构建匹配正则
match_pattern = '|'.join(A['content_escaped'])

# 从C中提取匹配的content
C['matched_content'] = C['data.data'].str.extract(f'({match_pattern})', expand=False)

# 去除C中无关行,按匹配内容合并
filtered_C = C.dropna(subset=['matched_content']).reset_index(drop=True)
result = pd.merge(A, filtered_C, left_on='content', right_on='matched_content', how='left')

方案二:定向顺序匹配(精准控制)

如果需要严格按顺序匹配(C中每个A的content只匹配下一个符合条件的行,不回头),可以用指针式匹配:

import pandas as pd
import re

# 给A添加索引,方便后续对应
A['a_index'] = range(len(A))
# 转义content
A['content_escaped'] = A['content'].apply(re.escape)

# 初始化匹配指针和结果列
current_a_pos = 0
total_a_rows = len(A)
C['matched_a_index'] = None

# 遍历C的行,按顺序匹配A的content
for idx, row in C.iterrows():
    if current_a_pos >= total_a_rows:
        break
    target_content = A.iloc[current_a_pos]['content_escaped']
    if re.search(target_content, row['data.data']):
        C.loc[idx, 'matched_a_index'] = current_a_pos
        current_a_pos += 1

# 合并结果
result = pd.merge(A, C.dropna(subset=['matched_a_index']), 
                  left_on='a_index', right_on='matched_a_index', how='left')

为什么之前str.contains可能失败?

  • 未处理content中的正则特殊字符(如.、*等),导致匹配逻辑出错
  • 没有利用顺序一致的条件,全量匹配出现多匹配/错匹配,无法得到预期结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:22:30