使用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
使用。
时的值是从宇宙仅仅样品的样品SD
被使用。
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的数据,“校正的样本标准差”是样本标准差。
感谢您的解释;) – user3378649 2014-10-28 11:19:50