含特殊字符列的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
相关产品推荐
相关产品推荐

