Python中如何将DataFrame内带负号的object类型值转换为float类型
报错核心原因
你写的转换逻辑有3个明显问题,直接导致转换失败:
pandas.Series.str.replace默认启用正则匹配模式,你写的匹配规则"−$"中$是正则语法里的「字符串结尾」元字符,无法匹配字面意义上的$符号,第一步的负号+货币符号替换完全没生效,原始的−$前缀一直残留到类型转换步骤,最终触发无法转float的报错。- 没有兼容样本里的两种货币数值格式:样本同时存在美元格式(
.作为小数点)、巴西雷亚尔格式(.作为千分位分隔符,,作为小数点),直接全局删除.和,会混淆整数位和小数位,就算替换成功数值结果也会错。 - 没有覆盖负号和货币符号之间带空格的场景,比如最后一条样本
'- $ 2344.92',原有规则无法正确识别负号。
修复方案
写一个通用的货币字符串解析函数,兼容你给出的所有样本格式,不需要写死某一种货币符号:
import pandas as pd # 初始化样本数据 d = {'price':['−$13.79', '−$ 13234.79', '$ 132834.79', 'R$ 75.900,00', 'R$ 69.375,12', '- $ 2344.92']} df = pd.DataFrame(data=d) def currency_to_float(s: str) -> float: # 识别符号位 sign = -1 if ('−' in s or '-' in s) else 1 # 只保留数字和分隔符,清除所有货币符号、空格 num_part = ''.join([c for c in s if c.isdigit() or c in ('.', ',')]) # 统一处理不同地区的分隔符规则 if ',' in num_part and '.' in num_part: # 同时存在两种分隔符时,位置靠后的是小数点 if num_part.rfind(',') > num_part.rfind('.'): num_part = num_part.replace('.', '').replace(',', '.') else: num_part = num_part.replace(',', '') elif ',' in num_part: # 仅存在逗号时,逗号后为2位则判定为小数点 num_part = num_part.replace(',', '.') if len(num_part.split(',')[-1]) == 2 else num_part.replace(',', '') return sign * float(num_part) # 应用转换 df['price'] = df['price'].apply(currency_to_float)
转换结果
运行后输出的DataFrame数值完全正确:
- 第一条:-13.79
- 第二条:-13234.79
- 第三条:132834.79
- 第四条:75900.00
- 第五条:69375.12
- 第六条:-2344.92
内容的提问来源于stack exchange,提问作者Val.Val
相关产品推荐
相关产品推荐

