2017-05-26 84 views
1

我有數據集df。該數據集內我有柱Gross 我完全陌生的Python,'int'對象不可下標。熊貓

enter image description here

我想這列轉換爲float和顯示sum()

dollarGross = lambda x: float(x[1:-1]) 
df.Gross = df.Gross.apply(dollarGross) 
df.Gross.sum() 

但我得到這個錯誤:

<ipython-input-294-a9010792122a> in <lambda>(x) 
----> 1 dollarGross = lambda x: float(x[1:-1]) 
     2 df.Gross = df.Gross.apply(dollarGross) 
     3 df.Gross.sum() 

TypeError: 'int' object is not subscriptable 

我錯過了什麼?

+3

'x [1:-1]'應該在你的lambda函數中做什麼?它看起來像你試圖在一個整數列上進行字符串操作......如果是這樣的話,那麼你可以直接執行'df.Gross.sum()'。 – mgilson

+0

我以爲我訪問csv文件後,所有列都是字符串 – Oleg

回答

2

你的錯誤從這裏開始:

df.Gross.apply(dollarGross) 

df.Gross是一個pandas.Series,當您使用apply方法時,熊貓遍歷系列中的每個成員,並將該成員傳遞給名爲dollarGross的「可調用」(也稱爲函數,更多信息在此)。要理解的關鍵是pandas.Series的成員。在這種情況下,它們是整數。所以系列中的每個整數被傳遞給dollarGross和被調用是這樣的:

dollarGross(184) 

這又是這樣的:

float(184[1:-1]) 

這是沒有意義的。您正嘗試使用[1:-1],它對整數使用下標/切片語法。這就是錯誤告訴你的:嘿,你不能下標一個整數!


這就是爲什麼它的好,告訴我們您正在嘗試做的。因爲現在我們可以幫助你做到這一點。記得我說過你可以傳遞一個「callable」給apply。那麼,floatfloat對象的類的名稱......這也是「可調用的」,因爲我們可以這樣做float(184)。所以......

df.Gross.apply(float) 

應該把事情做完。 然而,它仍然可能更好地做到這一點

df.Gross.astype(float) 

或者,如果一些df.Gross成員不能被解釋爲float值,它可能更好地使用@ MaxU的答案。

1

我想你只需要寫dollarGross = lambda x: float(x)。如果使用方括號,則嘗試訪問數組。

0

我想你應該使用

dollarGross = df['Gross'] #I defined a new array to store the Gross Values 
print(dollarGross.sum()) 
2

AFAIK pd.to_numeric()方法爲我們提供了最地道的方式將字符串轉換爲數值分開列:

df['Gross'] = pd.to_numeric(df['Gross'], errors='coerce') 
print(df['Gross'].sum())