Pandas数据框分组计算总体标准差

17

我试图使用groupby和np.std来计算标准差,但似乎它正在计算样本标准差(自由度为1)。

这里是一个示例。

#create dataframe
>>> df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)})
>>> df
   A  B  values
0  1  1      10
1  1  2      15
2  2  1      20
3  2  2      25

#calculate standard deviation using groupby
>>> df.groupby('A').agg(np.std)
      B    values
A                    
1  0.707107  3.535534
2  0.707107  3.535534

#Calculate using numpy (np.std)
>>> np.std([10,15],ddof=0)
2.5
>>> np.std([10,15],ddof=1)
3.5355339059327378

有没有一种方法可以在groupby语句中使用总体标准差计算(ddof = 0)? 我正在使用的记录不是样本(不是上面的示例表格),因此我只对总体标准差感兴趣。

2个回答

27
您可以在 agg 函数中向 np.std 传递其他参数:
In [202]:

df.groupby('A').agg(np.std, ddof=0)

Out[202]:
     B  values
A             
1  0.5     2.5
2  0.5     2.5

In [203]:

df.groupby('A').agg(np.std, ddof=1)

Out[203]:
          B    values
A                    
1  0.707107  3.535534
2  0.707107  3.535534

2
谢谢!我尝试过 "df.groupby('A').agg(np.std(ddof=0))",但我没有在 agg 括号中添加 ddof。我会在8分钟后标记您的回复为答案(您回复得非常快)。 - neelshiv
值得一提的是,不导入 numpy 也可以通过以下方式实现相同的结果: df.groupby('A').agg('std', ddof=1) - George Shimanovsky

7

对于自由度等于0的情况

这意味着只有一个数字的区间将得到 std=0 而不是 NaN

import numpy as np


def std(x): 
    return np.std(x)


df.groupby('A').agg(['mean', 'max', std])

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