'int'对象不可订阅。熊猫

时间:2017-05-26 16:25:06

标签: python pandas int

我有数据集df。在此数据集中,我有列Gross 我是Python的新手,

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

我错过了什么?

4 个答案:

答案 0 :(得分:2)

AFAIK pd.to_numeric()方法为我们提供了将字符串转换为数值的最惯用的方法:

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

答案 1 :(得分:2)

您的错误从此处开始:

df.Gross.apply(dollarGross)

df.Grosspandas.Series,当您使用apply方法时,pandas遍历系列的每个成员并将该成员传递给“callable”(也称为函数) ,更多关于这一点,名为dollarGross。要理解的关键是pandas.Series的成员是什么。在这种情况下,它们是整数。因此,系列中的每个整数都传递给dollarGross,并按以下方式调用:

dollarGross(184)

这反过来看起来像这样:

float(184[1:-1])

这没有任何意义。您正在尝试使用[1:-1]对整数进行下标/切片语法。这就是错误告诉你的:嘿,你不能下标一个整数!

这就是为什么告诉我们你想要做什么很好。因为现在我们可以帮助你做到这一点。记住我说过你可以将“可调用”传递给apply。好吧,floatfloat个对象类的名称......它也是“可调用的”,因为我们可以执行此操作float(184)。所以....

df.Gross.apply(float)

应该把事情做好。 然而,这样做可能还是更好

df.Gross.astype(float)

或者,如果df.Gross的某些成员无法解释为float值,则使用@ MaxU的答案可能会更好。

答案 2 :(得分:1)

我认为你只需要写dollarGross = lambda x: float(x)。如果使用方括号,则尝试访问数组。

答案 3 :(得分:0)

我认为您应该使用

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