【问题标题】:pandas, dataframe, groupby, std熊猫,数据框,groupby,std
【发布时间】:2013-12-19 11:50:09
【问题描述】:

这里是熊猫的新手。一个(微不足道的)问题:主机、操作、执行时间。我想按主机分组,然后按主机+操作,计算每个主机执行时间的标准偏差,然后按主机+操作对。看起来很简单?

它适用于按单列分组:

df
Out[360]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 132564 entries, 0 to 132563
Data columns (total 9 columns):
datespecial    132564  non-null values
host           132564  non-null values
idnum          132564  non-null values
operation      132564  non-null values
time           132564  non-null values
...
dtypes: float32(1), int64(2), object(6)



byhost = df.groupby('host')


byhost.std()
Out[362]:
                 datespecial         idnum      time
host
ahost1.test  11946.961952  40367.033852  0.003699
host1.test   15484.975077  38206.578115  0.008800
host10.test           NaN  37644.137631  0.018001
...

很好。现在:

byhostandop = df.groupby(['host', 'operation'])

byhostandop.std()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-364-2c2566b866c4> in <module>()
----> 1 byhostandop.std()

/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in std(self, ddof)
    386         # todo, implement at cython level?
    387         if ddof == 1:
--> 388             return self._cython_agg_general('std')
    389         else:
    390             f = lambda x: x.std(ddof=ddof)

/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _cython_agg_general(self, how, numeric_only)
   1615
   1616     def _cython_agg_general(self, how, numeric_only=True):
-> 1617         new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
   1618         return self._wrap_agged_blocks(new_blocks)
   1619

/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _cython_agg_blocks(self, how, numeric_only)
   1653                 values = com.ensure_float(values)
   1654
-> 1655             result, _ = self.grouper.aggregate(values, how, axis=agg_axis)
   1656
   1657             # see if we can cast the block back to the original dtype

/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, values, how, axis)
    838                 if is_numeric:
    839                     result = lib.row_bool_subset(result,
--> 840                                                  (counts > 0).view(np.uint8))
    841                 else:
    842                     result = lib.row_bool_subset_object(result,

/home/username/anaconda/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.row_bool_subset (pandas/lib.c:16540)()

ValueError: Buffer dtype mismatch, expected 'float64_t' but got 'float'

嗯??为什么我会得到这个异常?

更多问题:

  • 如何计算dataframe.groupby([several columns]) 的标准偏差?

  • 如何将计算限制在选定的列?例如。在这里计算日期/时间戳的 std dev 显然没有意义。

【问题讨论】:

    标签: python pandas statistics


    【解决方案1】:

    了解您的 Pandas / Python 版本很重要。看起来这个异常可能出现在 Pandas 版本 ValueError: Buffer dtype mismatch, expected 'float64_t' but got 'float')。为避免这种情况,您可以将 float 列转换为 float64

    df.astype('float64')
    

    要在选定的列上计算std(),只需选择列:)

    >>> df = pd.DataFrame({'a':range(10), 'b':range(10,20), 'c':list('abcdefghij'), 'g':[1]*3 + [2]*3 + [3]*4})
    >>> df
       a   b  c  g
    0  0  10  a  1
    1  1  11  b  1
    2  2  12  c  1
    3  3  13  d  2
    4  4  14  e  2
    5  5  15  f  2
    6  6  16  g  3
    7  7  17  h  3
    8  8  18  i  3
    9  9  19  j  3
    >>> df.groupby('g')[['a', 'b']].std()
              a         b
    g                    
    1  1.000000  1.000000
    2  1.000000  1.000000
    3  1.290994  1.290994
    

    更新

    就目前而言,看起来std()groupby 结果上调用了aggregation(),以及一个微妙的错误(参见此处-Python Pandas: Using Aggregate vs Apply to define new columns)。为避免这种情况,您可以使用apply():

    byhostandop['time'].apply(lambda x: x.std())
    

    【讨论】:

    • pip freeze 显示 pandas==0.12.0。我正在使用昨天下载的“Anaconda”发行版。
    • byhostandop['time'].std() 再次引发同样的异常。
    • 只是出于好奇,你试过byhostandop['time'].apply(lambda x:x.std())吗?
    • byhostandop['time'].apply(lambda x: x.std()) 工作。谢谢!
    • df.astype 回复中,您的意思是我应该显式转换列类型吗?像这样工作:df['time'] = df['time'].astype('float64'); byhostandop=df.groupby(['host', 'operation']); byhostandop['time'].std()。但我不确定这是否是惯用的 pandas 操作,或者我最好做些其他事情来获得正确的 (float64) 列中的 std dev 计算类型。
    猜你喜欢
    • 2016-10-09
    • 2021-04-30
    • 2021-12-06
    • 1970-01-01
    • 2017-05-18
    • 2023-01-12
    • 2018-08-01
    • 2016-09-08
    相关资源
    最近更新 更多