我导入了一个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
答案 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]
首先构建一个包含列表中所有无效字符的简单正则表达式,下一步是用空白字符替换所有无效字符,并检查以下事实:用空白字符替换它们不会产生空字符串(如果其他条件)。