使用Groupby Pandas DataFrame手动计算STD

问题描述:

我试图通过提供一种不同的和手动的方法来计算均值和标准,来为this question编写解决方案。使用Groupby Pandas DataFrame手动计算STD

我创建了dataframe as described in the question

a= ["Apple","Banana","Cherry","Apple"] 
b= [3,4,7,3] 
c= [5,4,1,4] 
d= [7,8,3,7] 

import pandas as pd 
df = pd.DataFrame(index=range(4), columns=list("ABCD")) 

df["A"]=a 
df["B"]=b 
df["C"]=c 
df["D"]=d 

然后,我创建了一个公司的名单没有重复。然后我通过将项目分组并每次计算项目来计算解决方案。

import numpy as np 

l= list(set(df.A)) 

df.groupby('A', as_index=False) 
listMean=[0]*len(df.C) 
listSTD=[0]*len(df.C) 

for x in l: 
    s= np.mean(df[df['A']==x].C.values) 
    z= [index for index, item in enumerate(df['A'].values) if x==item ] 
    for i in z: 
     listMean[i]=s 

for x in l: 
    s= np.std(df[df['A']==x].C.values) 
    z= [index for index, item in enumerate(df['A'].values) if x==item ] 
    for i in z: 
     listSTD[i]=s 

df['C']= listMean 
df['E']= listSTD 

print df 

我用describe()归类为“A”来计算均值,标准差。

print df.groupby('A').describe() 

并测试了建议的解决方案:

result = df.groupby(['a'], as_index=False).agg(
         {'c':['mean','std'],'b':'first', 'd':'first'}) 

我注意到,我得到了不同的结果,当我计算STD( “E”)。我只是好奇,我错过了什么?

还有two kinds of standard deviations (SD):人口SD和样本SD。

当值表示你正在学习值的整个宇宙人口SD

enter image description here

使用。

时的值是从宇宙仅仅样品的样品SD

enter image description here

被使用。

np.std默认情况下计算总体SD,Pandas'Series.std默认计算样本SD。

In [42]: np.std([4,5]) 
Out[42]: 0.5 

In [43]: np.std([4,5], ddof=0) 
Out[43]: 0.5 

In [44]: np.std([4,5], ddof=1) 
Out[44]: 0.70710678118654757 

In [45]: x = pd.Series([4,5]) 

In [46]: x.std() 
Out[46]: 0.70710678118654757 

In [47]: x.std(ddof=0) 
Out[47]: 0.5 

ddof代表“*度”,并且控制在SD公式从N减去的数字。上面的公式图片来自this Wikipedia page。在那里,“未校正的样本标准偏差”是我(和others)称为总体SD的数据,“校正的样本标准差”是样本标准差。

+0

感谢您的解释;) – user3378649 2014-10-28 11:19:50