2014-10-28 181 views
2

我試圖通過提供一種不同的和手動的方法來計算均值和標準,來爲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」)。我只是好奇,我錯過了什麼?

回答

3

還有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