3

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

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
4

1 回答 1

2

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'

sonp.std仅用于选择要调用的属性,默认ddof完全忽略,而是使用pandas默认的 of ddof=1

getattr(dft['D'], 'std')()
#1.6669847417133286
于 2020-03-12T04:37:18.503 回答