Python 熊猫,数据帧,groupby,标准
这里的熊猫是新来的。一个(微不足道的)问题:主机、操作、执行时间。我想按主机分组,然后按主机+操作,计算每个主机执行时间的std偏差,然后按主机+操作对。看起来很简单 它适用于按单个列进行分组:Python 熊猫,数据帧,groupby,标准,python,pandas,statistics,Python,Pandas,Statistics,这里的熊猫是新来的。一个(微不足道的)问题:主机、操作、执行时间。我想按主机分组,然后按主机+操作,计算每个主机执行时间的std偏差,然后按主机+操作对。看起来很简单 它适用于按单个列进行分组: df Out[360]: <class 'pandas.core.frame.DataFrame'> Int64Index: 132564 entries, 0 to 132563 Data columns (total 9 columns): datespecial 132564
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
...
df
Out[360]:
INT64索引:132564个条目,0到132563
数据列(共9列):
datespecial 132564非空值
主机132564非空值
idnum 132564非空值
操作132564非空值
时间132564非空值
...
数据类型:float32(1)、int64(2)、object(6)
byhost=df.groupby('host'))
byhost.std()
Out[362]:
日期特殊idnum时间
主办
ahost1.test 11946.961952 40367.033852 0.003699
host1.test 15484.975077 38206.578115 0.008800
主机10.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'
byhostandop=df.groupby(['host','operation'])
byhostandop.std()
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1 byhostandop.std()
/std中的home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc(self,ddof)
386#待办事项,在cython级别实施?
387如果ddof==1:
-->388返回自我。_cython_agg_general('std'))
389其他:
390 f=λx:x.std(ddof=ddof)
/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in_cython_agg_general(仅限self、how、numeric)
1615
1616 def_cython_agg_general(自身、方式、仅数值=真):
->1617新块=自块。_cython_agg_块(如何,仅数值块=仅数值块)
1618返回自包装块(新块)
1619
/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in_cython_agg_块(仅限self、how、numeric_)
1653值=com。确保浮动(值)
1654
->1655结果,=self.grouper.aggregate(值、方式、轴=聚合轴)
1656
1657#看看我们能否将块转换回原始数据类型
/home/username/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc合计(self、values、how、axis)
838如果是数字:
839结果=库行布尔子集(结果,
-->840(计数>0).视图(np.uint8))
841其他:
842 result=lib.row\u bool\u subset\u对象(result,
/pandas.lib.row_bool_子集中的home/username/anaconda/lib/python2.7/site-packages/pandas/lib.so(pandas/lib.c:16540)()
ValueError:缓冲区数据类型不匹配,应为'float64\u t',但得到'float'
嗯?为什么我会得到这个例外
更多问题:
- 如何在
dataframe.groupby([几列])上计算标准偏差
- 如何将计算限制在选定列?例如,在此处计算日期/时间戳上的标准偏差显然没有意义
float
列强制转换为float64
:
df.astype('float64')
要计算选定列上的std()
,只需选择列:)
更新
就目前而言,它看起来像是std()
正在对groupby
结果调用aggregation()。要避免这种情况,可以使用apply()
:
pip冻结显示熊猫==0.12.0。我使用的是昨天下载的“Anaconda”发行版。byhostandop['time'].std()
再次引发了同样的异常。只是出于好奇,您是否尝试过byhostandop['time'].apply(lambda x:x.std())
?byhostandop['time'].apply(lambda x:x.std())
。非常感谢。在df.astype
reply中,您的意思是我应该显式转换列类型吗?类似这样的工作:df['time']=df['time'].astype('float64');byhostandop=df.groupby(['host','operation']);byhostandop['time'].std()
。但我不确定这是否是惯用的pandas操作,或者我最好使用smth-else来获得std-dev计算列中正确的(float64)类型。
>>> 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
byhostandop['time'].apply(lambda x: x.std())