使用Groupby Pandas DataFrame手动计算标准差

3
我试图为这个问题编写一个解决方案,通过提供一种不同的手动方式来计算均值和标准差。
我按照问题描述创建了数据帧
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

接着,我创建了一个去重的A列表。然后,我遍历了这些项目,每次分组并计算出解决方案。

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'})

我注意到在计算“E”标准差时得到了不同的结果,我很好奇,我错过了什么?

1个回答

7

两种标准差(SD):总体标准差和样本标准差。

总体标准差

enter image description here

当所研究的值代表您正在研究的所有值宇宙时,使用总体标准差。

样本标准差

enter image description here

当这些值仅是该宇宙中的一个样本时,使用样本标准差。

np.std默认计算总体标准差,而Pandas的Series.std默认计算样本标准差。

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减去的数量。

上面的公式图片来自这个维基百科页面。那里的“未修正样本标准偏差”是我(和其他人)所说的总体SD,而“修正后的样本标准偏差”则是样本SD。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接