在求标准差(std)时所遇到的问题

在求标准差(std)时所遇到的问题

今天在处理数据时发现pandas中用std方法计算的标准差蜜汁诡异,所以就在网上进行了搜索,发现pandas求std与numpy有所差异,怕自己之后忘掉,所以把学习过程记录如下(用ipython编辑)。本人新入门菜鸟,如有错误,请指出!
先定义一个DataFrame

In [1]: import pandas as pd
In [2]: import numpy as np
data = pd.DataFrame([[3,6,9],[4,8,7],[15,2,85]],columns=['a','b','c'])
In [6]: data
Out[6]:
    a  b   c
0   3  6   9
1   4  8   7
2  15  2  85

计算标准差(默认为按列进行运算):

In [7]: data.std()
Out[7]:
a     6.658328
b     3.055050
c    44.467216
dtype: float64

然后抽取其中第一列放在numpy数组arr里,计算std并进行比较:

In [16]: arr = np.array([3,4,15])
In [17]: arr.std()
Out[17]: 5.436502143433364

我们发现,两种计算方式算出的标准差并不相同,查阅之后发现默认情况下,numpy 计算的是总体标准偏差,ddof = 0。另一方面,pandas 计算的是样本标准偏差,ddof = 1。如果我们知道所有的分数,那么我们就有了总体——因此,要使用 pandas 进行归一化处理,我们需要将“ddof”设置为 0。
换一种说法:
numpy.std() 求标准差的时候默认是除以 n 的,即是有偏的,np.std无偏样本标准差方式为 ddof = 1;
pandas.std() 默认是除以n-1 的,即是无偏的,如果想和numpy.std() 一样有偏,需要加上参数ddof=0 ,即pandas.std(ddof=0)

:ddof是什么?

ddof : int, optional
Means Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. By default ddof is zero.

此时再进行计算

In [15]: data.std(ddof=0)
Out[15]:
a     5.436502
b     2.494438
c    36.307330
dtype: float64

这样第一列的结果就相同了。

特别的,pandas中的describe方法统计信息中也含有std,但此std的ddof无法调整,故std还是默认ddof=1的值:

In [18]: data.describe()
Out[18]:
               a         b          c
count   3.000000  3.000000   3.000000
mean    7.333333  5.333333  33.666667
std     6.658328  3.055050  44.467216
min     3.000000  2.000000   7.000000
25%     3.500000  4.000000   8.000000
50%     4.000000  6.000000   9.000000
75%     9.500000  7.000000  47.000000
max    15.000000  8.000000  85.000000

参考博文:
1、https://blog.csdn.net/Gooooa/article/details/78923469
2、https://blog.csdn.net/grape875499765/article/details/78647937?utm_source=blogxgwz1
3、https://blog.csdn.net/u011587322/article/details/80934096
感谢各位大佬栽树,让新手乘凉

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值