Pandas字符串replace无法替换所有匹配项的问题排查
问题:Pandas无法替换Amount列的$和£货币符号
首先创建了如下DataFrame:
import pandas as pd dfsupport = pd.DataFrame({'Date': ['8/12/2020','8/12/2020','13/1/2020','24/5/2020','31/10/2020','11/7/2020','11/7/2020'], 'Category': ['Table','Chair','Cushion','Table','Chair','Mats','Mats'], 'Sales': ['1 table','3chairs','8 cushions','3Tables','12 Chairs','12Mats','4Mats'], 'Paid': ['Yes','Yes','Yes','Yes','No','Yes','Yes',], 'Amount': ['93.78','$51.99','44.99','38.24','£29.99','29 only','18'] })
尝试用以下代码替换Amount列中的$和£符号,但未生效:
patternv='|'.join(['$', '£']) dfsupport['Amount'] = dfsupport['Amount'].str.replace(patternv,'')
执行后,$51.99和£29.99仍未被替换,结果如下:
Date Category Sales Paid Amount 0 8/12/2020 Table 1 table Yes 93.78 1 8/12/2020 Chair 3chairs Yes $51.99 2 13/1/2020 Cushion 8 cushions Yes 44.99 3 24/5/2020 Table 3Tables Yes 38.24 4 31/10/2020 Chair 12 Chairs No £29.99 5 11/7/2020 Mats 12Mats Yes 29 only 6 11/7/2020 Mats 4Mats Yes 18 Date Category Sales Paid Amount 1 8/12/2020 Chair 3chairs Yes $51.99 4 31/10/2020 Chair 12 Chairs No £29.99
疑问:参考相关方案后问题仍存在,请问这是为什么?
原因及解决方法
问题根源
$是正则表达式中的特殊元字符,它代表匹配字符串的结尾位置。当你直接把$放进正则模式里时,Python的正则引擎不会把它当成普通的美元符号处理,自然匹配不到$51.99里的$,所以替换失败。而£没有特殊正则含义,问题核心出在$的转义上。
解决方法
方法1:转义特殊字符
对$进行转义,由于Python字符串中反斜杠需要二次转义,所以要写成\\$:
patternv='|'.join(['\\$', '£']) dfsupport['Amount'] = dfsupport['Amount'].str.replace(patternv,'')
方法2:关闭正则匹配模式
使用str.replace的regex=False参数,直接按普通字符串替换,无需考虑正则特殊字符:
# 逐个替换 dfsupport['Amount'] = dfsupport['Amount'].str.replace('$', '', regex=False) dfsupport['Amount'] = dfsupport['Amount'].str.replace('£', '', regex=False) # 批量替换写法 for symbol in ['$', '£']: dfsupport['Amount'] = dfsupport['Amount'].str.replace(symbol, '', regex=False)
执行任意一种方法后,$51.99会变为51.99,£29.99会变为29.99,达到预期效果。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

