TypeError:' float'对象没有属性' __ getitem __'在功能上

时间:2017-07-07 19:05:20

标签: python pandas numpy

我正在尝试将数据帧传递给函数,并从数据帧的不同列计算mean和std dev。当我逐步执行函数的每一行(没有编写这样的函数)时,它工作正常。但是,当我尝试编写一个计算函数时,我不断收到此错误:

TypeError: 'float' object has no attribute '__getitem__'

这是我的代码:

def computeBias(data):        

    meandata = np.array(data['mean'])
    sddata = np.array(data.sd)
    ni = np.array(data.numSamples)      

    mean = np.average(meandata, weights=ni)
    pooled_sd = np.sqrt((np.sum(np.multiply((ni - 1), np.array(sddata)**2)))/(np.sum(ni) - 1))

    return mean, pooled_sd


mean,sd = df.apply(computeBias)

这是样本数据:

id           type             mean           sd              numSamples
------------------------------------------------------------------------
1             33              -0.43          0.40               101
2             23              -0.76          0.1                100
3             33               0.89          0.56               101
4             45               1.4           0.9                100

这是完整的错误追溯:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-134-f4dc392140dd> in <module>()
----> 1 mean,sd = df.apply(computeBias)

C:\Users\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\core\series.pyc in apply(self, func, convert_dtype, args, **kwds)
   2353             else:
   2354                 values = self.asobject
-> 2355                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   2356 
   2357         if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\src\inference.pyx in pandas._libs.lib.map_infer (pandas\_libs\lib.c:66440)()

<ipython-input-133-2af38e3e29f0> in computeBias(data)
      1 def computeBias(data):
      2 
----> 3     meandata = np.array(data['mean'])
      4     sddata = np.array(data.sd)
      5     ni = np.array(data.numSamples)

TypeError: 'float' object has no attribute '__getitem__'

有没有人知道任何解决方法? TIA!

1 个答案:

答案 0 :(得分:1)

meandata = np.array(data['mean'])
TypeError: 'float' object has no attribute '__getitem__'

__getitem__是Python在您使用索引时尝试调用的方法。在标记的行中,表示data['mean']正在产生错误。显然data是一个数字,一个浮动对象。你不能索引一个数字。

data['mean']看起来像是要么尝试从字典中获取项目,要么使用命名索引从数据框中获取项目。我不会深入研究其余代码以确定您的意图。

你需要做什么才能理解data究竟是什么,以及产生它的原因。

你在df.apply(....)中使用它,显然认为它只是意味着

computeBias(df)   # or
computeBias(df.data)

相反,我怀疑apply在某些方面是在数据框上迭代,并将值或数据传递给代码。它没有通过整个数据帧。