Pandas - Groupby多列
问题描述:
我试图按多个列进行分组,并对它们进行分组,以便它们在分组后成为列表。Pandas - Groupby多列
目前,DataFrame
看起来是这样的:
我试图用这个:
grouped = DataFrame.groupby(['jobname', 'block'], axis=0)
DataFrame= grouped.aggregate(lambda x: list(x))
然而,当我申请这IPython的,它给了我这个错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-221-97113b757fa1> in <module>()
----> 1 cassandraFrame_2 = grouped.aggregate(lambda x: list(x))
2 cassandraFrame_2
/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
2867
2868 if self.grouper.nkeys > 1:
-> 2869 return self._python_agg_general(arg, *args, **kwargs)
2870 else:
2871
/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.pyc in _python_agg_general(self, func, *args, **kwargs)
1166 for name, obj in self._iterate_slices():
1167 try:
-> 1168 result, counts = self.grouper.agg_series(obj, f)
1169 output[name] = self._try_cast(result, obj)
1170 except TypeError:
/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.pyc in agg_series(self, obj, func)
1633 return self._aggregate_series_fast(obj, func)
1634 except Exception:
-> 1635 return self._aggregate_series_pure_python(obj, func)
1636
1637 def _aggregate_series_fast(self, obj, func):
/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.pyc in _aggregate_series_pure_python(self, obj, func)
1667 if (isinstance(res, (Series, Index, np.ndarray)) or
1668 isinstance(res, list)):
-> 1669 raise ValueError('Function does not reduce')
1670 result = np.empty(ngroups, dtype='O')
1671
ValueError: Function does not reduce
最终,我想g将相同的作业名组合在一起,但是数据是一个元组列表,现在它是一个3元组元组。
例如:
jobname block data
Complete-Test Simple_buff (tuple_1)
Complete-Test Simple_buff (tuple_2)
总结:
jobname block data
Complete-Test Simple_buff [(tuple_1),(tuple_2)]
我能集团通过jobname
,但是,这种聚合了block
在一起,但我想保持独立blocks
。
有人能指引我走向正确的方向吗?
感谢
答
貌似有一个明确的检查是由聚合函数返回的值是不是Series
,Index
,np.ndarray
或list
。
因此,下面应该工作:
grouped = df.groupby(['jobname', 'block'])
aggregated = grouped.aggregate(lambda x: tuple(x))
+0
这非常有帮助,谢谢 –
你能表明你希望获得的结果?错误消息说你需要给'aggregate'一个缩减函数,即为每个组返回一个标量(而不是一个列表或数组) – joris
@joris,我已经更新了我的问题以获得我想要的内容。基本上,如果jobname和block是相同的,那么将两个元组合在一起以形成两个元组的列表。有时候只有1个元组,有时候要组合2个或更多的元组。 – user1157751
回溯表明聚合函数不能返回一个列表,但是一个元组可以工作。 –