加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Pandas groupby agg std NaN

发布时间:2020-12-16 22:31:42 所属栏目:Python 来源:网络整理
导读:输入: df['PopEst'] .astype('float') .groupby(ContinentDict) .agg(['size','sum','mean','std'])) 输出: size sum mean stdAsia 5 2.898666e+09 5.797333e+08 6.790979e+08Australia 1 2.331602e+07 2.331602e+07 NaNEurope 6 4.579297e+08 7.632161e+0

输入:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读