【问题标题】:Convert Array object into float - ValueError: invalid literal for float将 Array 对象转换为浮点数 - ValueError:浮点数无效的文字
【发布时间】:2015-12-01 09:35:46
【问题描述】:

我导入了一个 csv 文件,其中有一列 ['Price'],其 dtype 是 object。

我想制作价格分布的直方图。

但是,我不知道如何将 dtype 从 'object' 转换为 'float'。

brandprice=product['Price'].values
brandprice

array(['2,143,562', '2,186,437', '2,214,903', ..., '-', '-', '-'], dtype=object)

map(float, brandprice) 

ValueError Traceback(最近一次调用最后一次) 在 () ----> 1 张地图(浮动,品牌价格) ValueError:float() 的无效文字:2,143,562

【问题讨论】:

  • 好吧,2,143,562 对浮点数无效。你需要去掉逗号才能得到一个有效的数字。 2,143,562真的代表2143562吗?

标签: python


【解决方案1】:

这实际上与使用数组没有任何关系,只是float 除了数字和. 符号外,不能很好地处理任何东西。所以你的逗号正在抛弃这个函数,因为它不知道该怎么做。

如果您调用replace(',', '') 来删除逗号,那么它会很好地解析:

>>> float("2,143,562")

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    float("2,143,562")
ValueError: invalid literal for float(): 2,143,562
>>> float("2,143,562".replace(',', ''))
2143562.0

由于您需要对完整列表执行此操作,我建议使用 map 和您自己编写的简短函数。像这样的:

def make_float(string):
    try:
        return float(string.replace(',', ''))
    except ValueError:
        return string

map(make_float, brandprice)

这将从字符串中去除逗号,然后尝试将其转换为浮点数。如果出现错误,原始字符串将原封不动地返回(如在您的示例数据中,您显示了一些字符串,例如 '-' 不会被解析。

【讨论】:

  • @stephdata replace 一次只适用于一个字符串,所以我建议在map 中使用更强大的函数。查看我的编辑。
【解决方案2】:

根据您给定的列表,您有 2 个无效字符"," and "-",这会在转换为 float 类型时引发错误,因此我建议您采用灵活的方法来添加更多无效字符。

import re
# You may try to typecast your numpy array as list object using `.tolist()`

a = ['2,143,562', '2,186,437', '2,214,903', '-', '-', '-']
rx = re.compile(',|-') #creating a regular expression including the invalid characters.

a_filtered = [rx.sub(r'', i) if rx.sub(r'', i) else 0 for i in a]
print map(float, a_filtered)
>>> [2143562.0, 2186437.0, 2214903.0, 0.0, 0.0, 0.0]

首先你用你列出的所有无效字符构造一个简单的正则表达式,下一步是用空白字符替换所有无效字符,并检查一个事实,用空白字符替换它们不会产生一个空字符串(如果其他条件)。

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2018-06-13
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多