关于numpy和pandas中std()函数的区别

今天在做实验时,发现pandas中std()函数计算出来的标准差与手工计算出来的值存在差异,怀疑之下,经查阅文档,发现pandas的std()与numpy的std()存在差异,实验流程如下;

import pandas as pd
import numpy as np
# df = pd.DataFrame([['a','b','c','d','e','f'],[1,2,3,4,5,6]],index=['one','two'],columns=['A','B','C','D','E','F'])
df = pd.DataFrame([[1,2,3,4,5,6],[6,4,1,2,3,5],[2,43,2,2,7,9]],index=['one','two','three'],columns=['A','B','C','D','E','F'])
print(df)
# print(df.count(axis=1))
# print(df.sum(1))
# print(df.mean())
# print(df.mode(axis=0))
# print(df.mode(axis=1))
print(df.std())
# print(df.describe())
# print(np.sqrt())
l1 = np.array([1,2,3])
print(l1.std())

从结果中我们可以看到,pandas计算出来的std与numpy计算出来的不一致。

根据手工计算,1,2,3的均值为2,方差为((1-2)^2+(2-2)^2+(3-2)^2)/3=2/3=0.666667,std肯定不会为1,所以numpy计算的应该是与我们知道情况一致;

但pandas的又是怎么回事呢,经计算,出现上述情况是pandas在计算过程中使用了index的标签所导致的,按照pandas的index标签,第一行的标签为0,第3行的标签为2,方差为((1-2)^2+(2-2)^2+(3-2)^2)/2 = 1,所以std为1。

要想正常计算pandas的std,需要建ddof设置为0即可;pandas的ddof默认为1;

import pandas as pd
import numpy as np
# df = pd.DataFrame([['a','b','c','d','e','f'],[1,2,3,4,5,6]],index=['one','two'],columns=['A','B','C','D','E','F'])
df = pd.DataFrame([[1,2,3,4,5,6],[6,4,1,2,3,5],[2,43,2,2,7,9]],index=['one','two','three'],columns=['A','B','C','D','E','F'])
print(df)
# print(df.count(axis=1))
# print(df.sum(1))
# print(df.mean())
# print(df.mode(axis=0))
# print(df.mode(axis=1))
print(df.std(ddof=0))
# print(df.describe())
# print(np.sqrt())
l1 = np.array([1,2,3])
print(l1.std())

需要注意的是在pandas中的describe()函数的统计中也有std信息,这里计算出来的std与未调整之前的std保持一致,且没有ddof设置,无法调整该值。

import pandas as pd
import numpy as np
# df = pd.DataFrame([['a','b','c','d','e','f'],[1,2,3,4,5,6]],index=['one','two'],columns=['A','B','C','D','E','F'])
df = pd.DataFrame([[1,2,3,4,5,6],[6,4,1,2,3,5],[2,43,2,2,7,9]],index=['one','two','three'],columns=['A','B','C','D','E','F'])
print(df)
# print(df.count(axis=1))
# print(df.sum(1))
# print(df.mean())
# print(df.mode(axis=0))
# print(df.mode(axis=1))
print(df.std(ddof=0))
print(df.describe())
# print(np.sqrt())
l1 = np.array([1,2,3])
print(l1.std())
       A   B  C  D  E  F
one    1   2  3  4  5  6
two    6   4  1  2  3  5
three  2  43  2  2  7  9
A     2.160247
B    18.873850
C     0.816497
D     0.942809
E     1.632993
F     1.699673
dtype: float64
              A          B    C         D    E         F
count  3.000000   3.000000  3.0  3.000000  3.0  3.000000
mean   3.000000  16.333333  2.0  2.666667  5.0  6.666667
std    2.645751  23.115651  1.0  1.154701  2.0  2.081666
min    1.000000   2.000000  1.0  2.000000  3.0  5.000000
25%    1.500000   3.000000  1.5  2.000000  4.0  5.500000
50%    2.000000   4.000000  2.0  2.000000  5.0  6.000000
75%    4.000000  23.500000  2.5  3.000000  6.0  7.500000
max    6.000000  43.000000  3.0  4.000000  7.0  9.000000
0.816496580927726

Process finished with exit code 0


  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Pythonnumpy.std()函数用于计算数组的标准差。这个函数默认是有偏的,也就是除以n。如果想要得到无偏的标准差,可以在函数加入参数ddof=1。 与之相对,pandasstd()函数默认是无偏的,也就是除以n-1。如果想要得到有偏的标准差,可以在函数加入参数ddof=0。 标准差是用来衡量数据集合数据的离散程度的一种指标。它越大,说明数据的离散程度越高,反之亦然。在数据分析和统计学,标准差是一个非常常用的指标,用于分析和比较数据的变化程度。因此,掌握numpystd()函数以及pandasstd()函数对于数据分析和统计非常重要。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pythonstd是什么](https://blog.csdn.net/weixin_39979167/article/details/111066934)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python-参数估计.docx](https://download.csdn.net/download/qq_43934844/87893679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值