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

含特殊字符列的Pandas DataFrame子串合并异常问题排查

解决带特殊字符的Pandas DataFrame子串匹配合并问题

问题根源

你之前的代码中,正则表达式的生成方式存在核心问题:直接拼接未转义的字符串时,括号()、斜杠/等特殊字符会被正则引擎当作语法符号解析,而非普通文本;若直接对整个拼接后的字符串用re.escape(),会把分支符|也转义成\|,彻底失去多分支匹配的功能,导致带特殊字符的条目无法匹配。

正确解决方案

对df1中的每个Name元素单独转义特殊字符,再拼接成正则分支,确保正则引擎将特殊字符视为普通文本,同时保留多分支匹配的逻辑:

import pandas as pd
import re

df1 = pd.DataFrame(
    {
        'Name': ['12,5mg/0,333ml(37,5mg/ml)', 'ad', 'aaa'],
    }
)

df2 = pd.DataFrame(
    {
        'Name': ['12,5mg/0,333ml(37,5mg/ml)', 'ad', 'aaaa'],
    }
)

# 对每个Name元素单独转义特殊字符,再拼接正则分支
escaped_names = [re.escape(name) for name in df1.Name]
str_match = f"({'|'.join(escaped_names)})"

# 使用expand=False返回Series作为合并键,简化处理
merged_df = df2.merge(
    df1,
    left_on=df2.Name.str.extract(str_match, expand=False),
    right_on="Name",
    how='outer',
    suffixes=('_df2', '_df1')
)

print(merged_df)

关键优化点

  • 单独转义每个元素:避免特殊字符干扰正则语法,同时保留|的分支匹配作用。
  • expand=False参数:让str.extract()返回Series而非DataFrame,更适合作为merge的连接键,减少不必要的列操作。

执行后,带特殊字符的12,5mg/0,333ml(37,5mg/ml)会正确匹配,ad、aaa、aaaa的子串/完全匹配逻辑也会正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:25:59