pandas 子字符串合并包含特殊字符的列

yx2lnoni  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(176)

我想合并“Name”列上的两个dfs。但是,其中一个可以是子字符串或完全等于另一列。为此,我使用了

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'],
    }
)

str_match = "({})".format("|".join(df1.Name))
df2.merge(df1, 
          left_on=df2.Name.str.extract(str_match)[0], 
          right_on="Name", how='outer')

“ad”、“aaa”、“aaaa”值已正确合并。但是,值“12,5 mg/0,333 ml(37,5 mg/ml)”出现问题(很可能是由于特殊字符)。What I got with this code snippet
我试过re.espace(),但是没有效果。我该怎么解决这个问题?

km0tfn4u

km0tfn4u1#

你需要对任何特殊字符进行转义,我也会只保留转义字符串的不同值(如果有很多重复的话,为了简化正则表达式),并事先编译模式:

pattern = re.compile('({})'.format(
    '|'.join(pd.unique(df1.Name.apply(re.escape)))
))
out = df2.merge(
    df1, 
    left_on=df2.Name.str.extract(pattern)[0],
    right_on="Name", how='outer')

>>> out
  Name                       Name_x                     Name_y                    
0  12,5mg/0,333ml(37,5mg/ml)  12,5mg/0,333ml(37,5mg/ml)  12,5mg/0,333ml(37,5mg/ml)
1                         ad                         ad                         ad
2                        aaa                       aaaa                        aaa
ehxuflar

ehxuflar2#

我觉得你应该做的是:

str_match = "({})".format("|".join(df1.Name))
df1.merge(df2['Name'], how='outer',
          left_on=df1['Name'].str.extract(str_match, expand=False)[0],
          right_on=df2['Name'].str.extract(str_match, expand=False)[0],
         ).drop(columns='key_0')

其给出:

Name_x                     Name_y
0  12,5mg/0,333ml(37,5mg/ml)  12,5mg/0,333ml(37,5mg/ml)
1                         ad                         ad
2                        aaa                       aaaa

相关问题