输入:
df['PopEst']
.astype('float')
.groupby(ContinentDict)
.agg(['size','sum','mean','std']))
输出:
size sum mean std
Asia 5 2.898666e+09 5.797333e+08 6.790979e+08
Australia 1 2.331602e+07 2.331602e+07 NaN
Europe 6 4.579297e+08 7.632161e+07 3.464767e+07
North America 2 3.528552e+08 1.764276e+08 1.996696e+08
South America 1 2.059153e+08 2.059153e+08 NaN
如果该组只有一行,则std列中的某些值变为NaN,但我认为这些值应为0,为什么会这样?
最佳答案
pd.DataFrame.std
默认采用1自由度,也称为样本标准差.这导致具有一个数字的组的NaN结果.
相比之下,numpy.std
默认为0自由度,也称为人口标准差.对于具有一个数字的组,这给出0.
要了解样本和人口之间的差异,请参阅Bessel’s correction.
因此,您可以为计算指定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',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','std']).fillna(0)