2

在处理我们的一些数据时,我必须执行非常基本的列条件组合。填充空值后,试图在列中添加一个新变量的赋值。其中一列最终成为对象,这并非史无前例。然而,我发现看似有效的值不会转换为浮点数(例如 4,789.67)。经过大量搜索,似乎我看到的每个解决方案都指向存在不规则字符(这没有描述我的情况)。因此,我尝试在 IPython 中进行实验以重新创建错误,并且我成功了。但是,我不明白为什么会出现此错误:

测试

z='4,534.07' #initial assignment
print z
print type(z) #checked type
print repr(z) #tried to reveal hidden characters
print repr(z.replace("'","")) #tried to remove excess quotes
print z[1:-1] #tried again to remove excess quotes
print float(z) #failed conversion attempt

输出

4,534.07
<type 'str'>
'4,534.07'
'4,534.07'
,534.0


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-70-8a3c46ebe6ab> in <module>()
      6 print z[1:-1]
      7 print z
----> 8 print float(z)

ValueError: invalid literal for float(): 4,534.07

我看到的基本转换问题的解决方案总是建议将“x”转换为浮点数->> float(x)。我将非常感谢任何能够解释我错过了什么的人。(我以前没有发生过这种情况。)

我一直在使用 Enthought 平台:


发行说明 Canopy 1.0.0.1160

天篷 1.0.0

第一次发布。请参阅 Documention Browser、Canopy 用户指南以获取描述新功能和任何已知问题和解决方法的发行说明


谢谢

4

2 回答 2

5

唯一的问题是您必须删除逗号。4,534.07不是有效的浮点文字,但是4534.07是。

(这正是 theValueError: invalid literal for float(): 4,534.07告诉你的内容,只是它缺少“你的意思是......?”的建议。)

所以:

z='4,534.07'
print float(z.replace(',', ''))

此外,所有那些“删除多余引号”的尝试都无济于事,因为字符串中没有引号。当然,当您打印出repr字符串时会有引号,但这并不意味着它们在字符串本身中,这意味着repr任何字符串的 都包含在一对额外的引号中。由于这些引号不在字符串中,因此它们不会影响您在该字符串上调用的任何函数(除非该函数确实做了一些非常非常愚蠢的事情,比如调用repr它的参数来构建一个要调用的字符串eval……)。

另外,即使问题多余的引号,只是print z[1:-1]print z.replace("'", "")实际上不会将它们从z中删除,它只会打印出如果你这样做了会是什么样子。要真正改变 的值z,你必须给它赋值。例如,如果您添加print z.replace(',', '')到现有代码中,float(z)仍然会失败。但是,如果您添加z = z.replace(',', '')float(z)则将成功。

于 2013-04-24T20:13:58.500 回答
0

我会用 re 替换任何不是数字或点的东西。像

>>> import re
>>> float(re.sub(r'[^0-9.]', '', '1.234,567'))
1.234567

如果您关心符号,则在您的模式中包含 - 和 +

float(re.sub(r'[^-+\d.]', '', '-1.234,567'))
于 2013-04-24T20:17:51.650 回答