2017-05-26 49 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())