2015-12-01 101 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

相關問題