2015-12-01 95 views
2

我导入了一个csv文件,其中的dtype是object的列['Price']将数组对象转换为浮点值 - ValueError:浮点数的无效文字

我想做一个价格分布的直方图。

但是,我不知道如何将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 (most recent call last) in() ----> 1 map(float, brandprice) ValueError: invalid literal for float(): 2,143,562

+1

那么,'2,143,562' *对于浮点数无效。您需要从中删除逗号以获取有效的号码。 '2,143,562'确实代表'2143562'吗? – deceze

回答

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] 

首先构造一个简单的正则表达式,在你列表中的所有无效字符,下一步就是要全部更换带空白字符的无效字符,并且检查将其替换为空白字符的事实不会产生一个空字符串(如果其他条件为此)。

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) 

这将从字符串中去掉逗号,然后尝试将其变成浮动。如果错误出现的原始字符串返回不变(如您的样本数据,你表现出一定的串像'-'它不会被解析。

+0

@stephdata'replace'一次只适用于一个字符串,所以我建议在'map'中使用更强大的函数。看我的编辑。 – SuperBiasedMan

相关问题