熊猫DataFrame和numpy标准差不同

时间:2020-06-24 10:58:49

标签: python pandas numpy data-science

简单地问,为什么此std与众不同?

>>> import numpy
>>> import pandas as pd
>>>
>>> arr = [10, 386, 479, 627, 20, 523, 482, 483, 542, 699, 535, 617, 577, 471, 615, 583, 441, 562, 5
63, 527, 453, 530, 433, 541, 585, 704, 443, 569, 430, 637, 331, 511, 552, 496, 484, 566, 554, 472, 3
35, 440, 579, 341, 545, 615, 548, 604, 439, 556, 442, 461, 624, 611, 444, 578, 405, 487, 490, 496, 3
98, 512, 422, 455, 449, 432, 607, 679, 434, 597, 639, 565, 415, 486, 668, 414, 665, 763, 557, 304, 4
04, 454, 689, 610, 483, 441, 657, 590, 492, 476, 437, 483, 529, 363, 711, 543]
>>> elements = numpy.asarray(arr)
>>> arr_D = {"A":arr}
>>> df = pd.DataFrame(arr_D)
>>>
>>> print(numpy.std(elements, axis=0))
118.51857760182034
>>> print(numpy.std(df['A']))
118.5185776018204
>>> print(df['A'].std(axis=0))
119.15407050904474

我对主题的理解是否有问题?据我所知,大熊猫使用numpy。同一列的datafram std和numpy std应该相同。

这是一个错误吗?

2 个答案:

答案 0 :(得分:2)

Numpy使用有偏的std和无偏的熊猫。换句话说,numpy除以n(元素数),而pandas除以n-1。尝试按照以下步骤查看是否匹配:

print(df['A'].std(axis=0)/np.sqrt(len(arr))*np.sqrt((len(arr)-1)))
#118.51857760182033

答案 1 :(得分:2)

pandas 默认情况下使用Unbiased estimation,而 numpy 默认情况下不使用,因此它们都不正确,因此它们使用不同的方法来计算 std
要使 numpy 使用无偏估计ddof=1传递到std

>>> import numpy
>>> import pandas

>>> df = pandas.DataFrame(numpy.random.rand(100))

>>> numpy.std(df[0]) #default std biased estimation
0.2877601644414916

>>> numpy.std(df[0],ddof=1) #with ddof=1 i.e unbiased estimation
0.2892098469889083

>>> df[0].std() # unbiased estimation match with numpy std with ddof=1
0.2892098469889083