DataFrame列正则替换未达预期且报错的问题解决
问题
现有如下pandas DataFrame:
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 21 only','18'] })
表格展示:
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 21 only 6 11/7/2020 Mats 4Mats Yes 18
已成功用以下代码移除Amount列中的$和£符号:
patternv='|'.join(re.escape(x) for x in ['$', '£']) dfsupport['Amount'] = dfsupport['Amount'].str.replace(patternv, '', regex=True)
尝试将Amount列中的29 21 only替换为29.21时,使用了如下代码:
patterns="{r'(\d{1,})\s(\d{1,2})\D+' : r'\1 \2'}" dfsupport['Amount']=dfsupport['Amount'].str.replace(patterns,regex=True)
运行后报错:
Traceback (most recent call last): File "/home/cloud/code/learning/howmany.py", line 160, in <module> dfsupport['Amount'] = dfsupport['Amount'].str.replace(patternv,regex=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/cloud/.venv/lib/python3.12/site-packages/pandas/core/strings/accessor.py", line 136, in wrapper return func(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: StringMethods.replace() missing 1 required positional argument: 'repl'
需要修复该问题,实现将29 21 only替换为29.21的需求。
解决方案
错误原因
str.replace方法需要分别传入**匹配模式(pat)和替换内容(repl)**两个必填参数,你错误地将两者封装成字符串形式的字典传入,导致方法识别不到必填的repl参数。- 原正则的替换逻辑有误,需要把数字间的空格替换为
.,而非保留空格。
修复代码
# 先处理$和£符号(修正原代码,补充空字符串作为替换值) patternv='|'.join(re.escape(x) for x in ['$', '£']) dfsupport['Amount'] = dfsupport['Amount'].str.replace(patternv, '', regex=True) # 处理"29 21 only"这类格式的内容 # 正则匹配:数字 + 空格 + 数字 + 后续任意非数字内容 # 替换为:第一组数字 + . + 第二组数字 dfsupport['Amount'] = dfsupport['Amount'].str.replace(r'(\d+)\s(\d+)\D+', r'\1.\2', regex=True) # 可选:将Amount列转换为数值类型(方便后续计算) dfsupport['Amount'] = pd.to_numeric(dfsupport['Amount'], errors='coerce')
执行结果
处理后的Amount列内容:
0 93.78 1 51.99 2 44.99 3 38.24 4 29.99 5 29.21 6 18.00 Name: Amount, dtype: float64
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

