2017-07-07 260 views
0

我试图将数据框传递给函数,并从数据框的不同列计算mean和std dev。当我逐步执行函数的每一行时(没有像这样写函数),它工作正常。然而,当我尝试写一个函数来计算,我不断收到此错误:TypeError:'float'对象在函数中没有属性'__getitem__'

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!

+0

请在完整的错误追溯中编辑 –

+0

@OferSadan:完成。 – Gingerbread

+0

你谷歌的错误?有相当多的https://stackoverflow.com/questions/25950113/float-object-has-no-attribute-getitem-python-error问题引用该错误。 – gobrewers14

回答

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的迭代,在某些方面,在数据帧,并通过值或dataseries到你的代码。它没有传递整个数据帧。

+0

我想这是应用函数的一些问题。我使用apply,因为我想传递分组对象以及函数。但它不管用。所以,我只是遍历组并通过发送相应的列来计算统计信息。 – Gingerbread

相关问题