4

这可能是一个错误吗?当我对 groupby 对象使用 describe() 或 std() 时,我得到了不同的答案

import pandas as pd
import numpy as np
import random as rnd

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)})
df.head()

df[['C','D']].groupby(['C'],as_index=False).describe()
# this line gives me the standard deviation of 'C' to be 0,0. Within each    group value of C is constant, so that makes sense. 

df[['C','D']].groupby(['C'],as_index=False).std()
# This line gives me the standard deviation of 'C' to be 0,1. I think this is wrong
4

3 回答 3

1

这说得通。在第二种情况下,您只计算stdof columnD

如何?这就是groupby工作原理。你

  1. 切片CD
  2. groupbyC
  3. 称呼GroupBy.std

在第 3 步,您没有指定任何列,因此std假定在不是grouper 的列上计算... aka, column D

至于为什么你看到C...0, 1那是因为你指定as_index=False了 ,所以该C列插入了来自原始数据帧的值......在这种情况下是0, 1.

运行它,它会变得清晰。

df[['C','D']].groupby(['C']).std()

          D
C          
0  0.998201
1       NaN

当您指定时as_index=False,您在上面看到的索引将作为一插入。与此对比,

df[['C','D']].groupby(['C'])[['C', 'D']].std()

     C         D
C               
0  0.0  0.998201
1  NaN       NaN

这正是describe提供的,以及您正在寻找的。

于 2018-03-22T04:23:55.303 回答
1

我的朋友 mukherjees 和我对这个做了更多的试验,并确定 std() 确实存在问题。您可以在下面的链接中看到,我们如何显示“std() 与 .apply(np.std, ddof=1) 不同。” 注意到后,我们还发现了以下相关的错误报告:

https://github.com/pandas-dev/pandas/issues/10355

于 2018-04-12T18:07:38.157 回答
-1

即使使用 std(),您也会在每组中获得 C 的零标准偏差。我刚刚在您的代码中添加了一个种子以使其可复制。我不确定是什么问题-

import pandas as pd
import numpy as np
import random as rnd

np.random.seed=1987
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)})
df

df[['C','D']].groupby(['C'],as_index=False).describe()

在此处输入图像描述

df[['C','D']].groupby(['C'],as_index=False).std()

在此处输入图像描述

再深入一点,如果你看一下继承自 DataFrame.describe 的 groupby 的 describe 源代码,

def describe_numeric_1d(series):
            stat_index = (['count', 'mean', 'std', 'min'] +
                          formatted_percentiles + ['max'])
            d = ([series.count(), series.mean(), series.std(), series.min()] +
                 [series.quantile(x) for x in percentiles] + [series.max()])
            return pd.Series(d, index=stat_index, name=series.name)

上面的代码显示 describe 只显示 std() 的结果

于 2018-03-22T04:27:22.843 回答