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

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的需求。

解决方案

错误原因

  1. str.replace方法需要分别传入**匹配模式(pat)和替换内容(repl)**两个必填参数,你错误地将两者封装成字符串形式的字典传入,导致方法识别不到必填的repl参数。
  2. 原正则的替换逻辑有误,需要把数字间的空格替换为.,而非保留空格。

修复代码

# 先处理$和£符号(修正原代码,补充空字符串作为替换值)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:35:34