使用Pandas GroupBy的describe()与std()结果不一致,是否为Bug?
GroupBy.describe() 和 std() 结果不一致?这不是Bug!
嘿,这绝对不是Bug!我来给你掰扯清楚为啥会出现这种差异~
核心原因:自由度(ddof)的默认值不一样
Pandas里这两个方法计算标准差时,默认使用的自由度参数(ddof)不同:
- 直接调用
groupby(...).std()时,默认用的是ddof=1(样本标准差,计算时除以n-1,更适合用来估计总体标准差) - 而
describe()方法里的标准差计算,默认用的是ddof=0(总体标准差,计算时除以n,适合描述当前数据集的离散程度)
用代码验证一下
先跑你的复现代码,然后对比两种方式的结果:
import pandas as pd import numpy as np # 生成数据 df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : 1*(np.random.randn(8)>0.5), 'D' : np.random.randn(8)}) # 获取describe里的D列标准差 desc_std = df[['C','D']].groupby(['C'],as_index=False).describe().loc[:, ('D', 'std')] print("describe()里的标准差:") print(desc_std) # 获取直接调用std()的结果(默认ddof=1) direct_std = df[['C','D']].groupby(['C'],as_index=False).std()['D'] print("\n直接调用std()的结果:") print(direct_std) # 让std()用ddof=0,和describe默认一致 std_ddof0 = df[['C','D']].groupby(['C'],as_index=False).std(ddof=0)['D'] print("\nstd(ddof=0)的结果:") print(std_ddof0)
你会发现,std(ddof=0) 的结果和 describe() 里的标准差完全一致!
怎么让两者结果统一?
有两种方式:
- 调用
std()时指定ddof=0,和describe()默认对齐 - 调用
describe()时指定ddof=1,和std()默认对齐:
# describe用ddof=1,和默认std()一致 desc_ddof1 = df[['C','D']].groupby(['C'],as_index=False).describe(ddof=1).loc[:, ('D', 'std')] print(desc_ddof1) print(direct_std) # 两者结果相同
这是Pandas的设计选择——describe() 偏向展示数据集的总体统计特征,而单独的 std() 默认做样本统计推断,所以参数默认值不同,完全不是Bug哦~
内容的提问来源于stack exchange,提问作者OzgunBu
相关产品推荐
相关产品推荐

