Python无效的float()字面量

3

我正在使用HIGGS数据集进行我的数据挖掘项目。在使用Python解析数据时,我收到了以下错误信息:

ValueError: invalid literal for float(): -8.854051232337951660e-

我在使用分布式环境下的Apache Spark时,遇到了许多同类数值的错误。以下是我的数据集中的一行内容。

1.000000000000000000e+00,8.004817962646484375e-01,-3.643184900283813477e-01,-4.785313606262207031e-01,2.399173498153686523e+00,**-8.854051232337951660e-01**,1.204909682273864746e+00,-8.518521487712860107e-02,1.364478588104248047e+00,0.000000000000000000e+00,4.605550169944763184e-01,1.564514338970184326e-01,1.068501710891723633e+00,0.000000000000000000e+00,1.793796300888061523e+00,1.236290574073791504e+00,5.773849487304687500e-01,2.548224449157714844e+00,1.083405137062072754e+00,1.178002059459686279e-01,-1.116195082664489746e+00,0.000000000000000000e+00,8.484367132186889648e-01,1.113812208175659180e+00,9.878969192504882812e-01,5.820630192756652832e-01,4.325648546218872070e-01,1.004681587219238281e+00,8.518054485321044922e-01

我已经检查过数据,没有任何差异。

有人能帮我解决这个错误信息吗?

2个回答

2
异常提示显示:

-8.854051232337951660e- 不是一个有效的 Python 浮点数

特别地,科学计数法是可以接受的,但需要在 e 后面加上一些内容 - 你的数据格式不正确。以下是可以接受的格式;

  • -8.854051232337951660e-1
  • -8.854051232337951660
  • -8.854051232337951660e1
或者,如果你更喜欢的话,可以从文档这里获取。
一些浮点数字面量的例子: 3.14 10. .001 1e100 3.14e-10 0e0
没有尾数数字的数据没有任何意义。没有e,Python可以假设字面值已终止;有了额外的数字,Python可以扩展科学计数法。
如果数据在你看来没问题,但Python似乎无法理解正在发生什么,请检查可能存在的微妙格式错误,例如e和下一个数字之间的空格。
作为回应编辑
最后一点非常关键。数据在你眼里“看起来”不错,但Python却抱怨;这是因为你在Python中的“解析”方式与你用眼睛和大脑解析的方式不一致。你用什么来解析数据?你按逗号分隔吗?你在数字开始时分隔(那会引起问题)。异常如上所述被触发;对你来说,问题是追踪下为什么在你的解析中裁剪掉了最后一个数字。(顺便说一句,这听起来像是一个新问题,而不是这个问题的延续)。
例如,在你新发布的代码中,看起来在“e-”后面和“01”之前有一个换行符。如果这是我的浏览器的问题,那就算了。如果不是,那就是你的问题。
为了跳过错误的条目,你可以做像这样的事情(简而言之,尝试/除外它们,因为请求原谅比请求许可更好)。

实际上,我只在这个特定的值出现的地方遇到了错误。 - Shinchan
1
那么你的解析器存在一个一贯性问题(太好了!可重现性大大简化了调试过程)。该文字是完全有效的(带有后面的数字),手动将其插入Python并自行检查。这个数字被裁剪了,这是一个解析问题,而不是一个转换问题。 - en_Knight
同时,感谢您(1)发布堆栈跟踪,然后(2)发布您的数据。这使得回答问题变得非常容易。 - en_Knight
我不确定你问题中分隔e和-01的换行符是由于我的浏览器大小还是实际上存在换行符。如果有,那肯定就是问题所在。 - en_Knight
那个新行在数据中并不存在,这只是浏览器的问题。 - Shinchan
我的解析器方法, def parsePoint(line):values = [float(x) for x in line.split(',')] return LabeledPoint(values[0], values[1:]) - Shinchan

0

根据

ValueError: invalid literal for float(): -8.854051232337951660e-

解析器过早地分割了该值。

因此,您应该查看分割后的项目的样子。

所以尝试一下:

for x in line.split(','):
    print repr(x),
    print repr(float(x))

你会看到每个项目发生了什么。

就我个人而言,除了数据文件损坏并出现了不应有的换行或逗号之外,我不知道这可能发生的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接