почему np.std () и pivot_table (aggfunc = np.std) возвращают разные результаты - PullRequest
3 голосов
/ 12 марта 2020

У меня есть некоторый код, и я не понимаю, почему возникает разница:

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

1 Ответ

2 голосов
/ 12 марта 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...