将Array对象转换为float - ValueError:float

时间:2015-12-01 09:35:46

标签: python

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

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

然而,我不知道如何将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(最近一次调用最后一次)   in()   ----> 1张地图(浮动,品牌价格)   ValueError:float()的文字无效:2,143,562

2 个答案:

答案 0 :(得分:2)

这实际上与使用数组完全无关,只是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)

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

答案 1 :(得分:0)

根据您的给定列表,您有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]

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