为什么np.std()和pivot_table(aggfunc=np.std)返回的结果不同?[英] why np.std() and pivot_table(aggfunc=np.std) return the different result

本文是小编为大家收集整理的关于为什么np.std()和pivot_table(aggfunc=np.std)返回的结果不同?的处理方法,想解了为什么np.std()和pivot_table(aggfunc=np.std)返回的结果不同?的问题怎么解决?为什么np.std()和pivot_table(aggfunc=np.std)返回的结果不同?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一些代码,不明白为什么会出现差异:

np.std() 单独使用时默认ddof=0.

但是为什么当它在pivot_table(aggfunc=np.std)中用作参数时,它会自动变为ddof=1.

import numpys as np
import pandas as pd
dft = pd.DataFrame({'A': ['one', 'one'],
               'B': ['A', 'A'],
               'C': ['bar', 'bar'],
               'D': [-0.866740402,1.490732028]})



np.std(dft['D'])
#equivalent:np.std([-0.866740402,1.490732028]) (which:defaualt ddof=0) 
#the result: 1.178736215

dft.pivot_table(index=['A', 'B'],columns='C',aggfunc=np.std)
#equivalent:np.std([-0.866740402,1.490732028],ddof=1) 
#the result:1.666985

推荐答案

pivot 使用 DataFrame.groupby.agg,当你提供一个聚合函数时,它会尝试弄清楚如何_aggregate.

arg=np.std会在这里处理,相关代码是

f = self._get_cython_func(arg)
if f and not args and not kwargs:
    return getattr(self, f)(), None

隐藏在 DataFrame 类中的是这张表:

pd.DataFrame()._cython_table
#OrderedDict([(<function sum>, 'sum'),
#             (<function max>, 'max'),
#             ...
#             (<function numpy.std>, 'std'),
#             (<function numpy.nancumsum>, 'cumsum')])

pd.DataFrame()._cython_table.get(np.std)
#'std'

所以np.std只用来选择要调用的属性,默认的ddof被完全忽略,取而代之的是pandas默认的ddof=1.

getattr(dft['D'], 'std')()
#1.6669847417133286

本文地址:https://www.itbaoku.cn/post/1728209.html