1. 程式人生 > >ValueError: could not convert string to float: '?'

ValueError: could not convert string to float: '?'

昨兒個想處理一個百萬資料量的時間序列資料,本來單純的以為資料都是可以用float()轉換的str,可是在執行下面程式碼時就會報錯:

power = household_power.Global_active_power[6838:6840].apply(lambda x: float(x) if type(x)==str else 0)

於是懷疑自己的lambda是不是寫錯了,還是apply函式用錯了,可最後發現沒啥問題啊!直到最後我開始懷疑資料,用簡單粗暴的方式,二分排查,最終終於找到了罪魁禍首:

In[1]: 
household_power.Global_active_power[
6838:6840] Out[1]: Date 21/12/2006 0.244 21/12/2006 ? Name: Global_active_power, dtype: object

看到那個“?”了嗎啊,沒錯就是他,害得我調了幾個小時(主要還是因為我菜)
找到了問題就得解決,可是上百萬的資料中,可能還有其他這種“?”,得找個方法過濾掉它,於是乎在嘗試各種if,else判斷無果後,我突然想起了try, except,哇!是真的好用!

def format(x):
    try:
        return float(x)
    except ValueError:
        x =
0.0 return x

這樣一個格式化函式,可以在報錯的“?”號處起到過濾效果,開始小激動了。
回到開始的地方,用在apply裡

power = household_power.Global_active_power.apply(format)
plt.figure(figsize=(10, 8))
power.plot()
plt.show()

哦了,完美解決問題!菜雞第一次感受到來自try except的愛!