pd.DataFrame.std
предполагает по умолчанию 1 степень свободы, также известную как выборка стандартное отклонение. Это приводит к NaN
результатам для групп с одним номером.
numpy.std
, напротив, по умолчанию предполагает 0 степеней свободы, также известный как популяция стандартное отклонение. Это дает 0
для групп с одним номером.
Чтобы понять разницу между выборкой и населением, см. Поправка Бесселя .
Таким образом, вы можете указать numpy.std
для вашего расчета. Обратите внимание, однако, что выходные данные будут отличаться, так как расчеты разные. Вот минимальный пример.
import pandas as pd, numpy as np
df = pd.DataFrame(np.random.randint(0, 9, (5, 2)))
def std(x): return np.std(x)
res = df.groupby(0)[1].agg(['size', 'sum', 'mean', std])
print(res)
size sum mean std
0
0 2 13 6.5 0.5
4 1 3 3.0 0.0
5 1 3 3.0 0.0
6 1 3 3.0 0.0
В качестве альтернативы, если вам требуется 1 степень свободы, вы можете использовать fillna
для замены NaN
значений на 0
:
res = df.groupby(0)[1].agg(['size', 'sum', 'mean', 'std']).fillna(0)