首先上文档

numpy:

numpy_std.png

然后是pandas:

pandas_dataframe_std.png

所以此处区别就明显了,np中求平均的时候除以的是数据的总数N,而pd中却是N-1。

为什么要除以N-1呢?

这就涉及到一个名词:wiki: 贝塞尔校正
这个问题在numpy文档的下面紧接着也解释了,照例,还是先上文档:

numpy_notes.png

关键句在这里:
In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population

意思就是在统计学的实践中,往往遇到的情况是数据集特别大(infinite population),所以通常来判断数据集的std是通过抽样一部分数据来计算std从而来推断整个数据集的std,但是就会有一个问题,在一个分布不均匀的数据集中抽样,会导致std过小。为什么呢?看这个例子:

比如一个数据集是关于乐高积木块的种类,整个乐高积木的种类假设很多很多,数万种,而我从中抽取一部分积木,来计算std,因为抽样出来的种类的分布比率很大概率上不会跟总数保持一致(比如有可能某种积木在总数中只有几块,导致抽样时无法抽取到它),所以就会造成抽样数据中的分布有可能相对没那么离散,std相对没那么大。为了解决这个问题,希望std稍微大一些,从而能更好的判断总数据集的std,怎么办?就把求平均时候的N改成N-1,std就会“人为”的大一些。(具体为什么是-1,不是-2,-3或者除2,除3这我就不太清楚了,应该是前人经验得出。。。)

总结

所以一定要搞清楚numpy跟pandas中求std结果不同的原因,直接原因是因为默认的ddof参数不同,numpy是0,pandas是1,算法本身是没有区别的。然后追究深层次的原因来理解为什么不同,就要知道-1的目的是什么。

而至于为什么numpy不减1,pandas减1,我个人理解是因为numpy主要是处理数据本身,对于numpy来说解决的是运算上的问题。而pandas是直接面向数据所代表的含义的,使用pandas通常来说数据是有具体含义的。所以pandas会根据经验帮你做了-1的操作,而numpy仅仅是按照数学计算定义层面来求平均值。

初学者,如果有哪里说得不对或者不全面的话,希望大家多多指教。谢谢。