python pandas聚合非数字类型

时间:2013-12-03 08:13:16

标签: python arrays numpy pandas aggregate

我有以下问题,我设法在某些列上创建一个带有对象dtypes的数据框。 特别是这些将是2d numpy数组,但它们可以是任何非数字类型。现在我想转动我的数据帧。有没有办法传递我选择的聚合函数对这些对象起作用?我似乎无法做到这一点,我得到错误:

GroupByError:没有要聚合的数字类型

例如,假设我有这个虚拟数据框:

date foo  bar               mat
1     a   x      [[1, 2], [3, 4]]
1     b   x      [[1, 2], [3, 4]]
1     a   y      [[1, 2], [3, 4]]
1     b   y      [[1, 2], [3, 4]]
2     a   x      [[4, 5], [6, 7]]
2     b   x      [[4, 5], [6, 7]]
2     a   y      [[4, 5], [6, 7]]
2     b   y      [[4, 5], [6, 7]]

我希望有一个类型的新数据框:

dd.pivot_table(values=['mat'], rows=['date'], cols=['foo'], aggfunc= ??)

其中我的2-d数组将是'foo'列中具有相同值的数组的逐元素和。我怎样才能做到这一点?如果不可能,是否可以在具有相同'foo'的数组列表中选择第一次出现的'mat'元素? 感谢

添加了所需的输出:

date    a               b           
1    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
2    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]

1 个答案:

答案 0 :(得分:1)

您可以先分组然后转动:

>>> grouped = df.groupby(('foo', 'date'))
>>> g = grouped['mat'].apply(lambda x: np.array(map(np.array, x.values)).T.sum(axis=2).T).reset_index()
>>> g
  foo  date                    0
0   a     1     [[2, 4], [6, 8]]
1   a     2  [[8, 10], [12, 14]]
2   b     1     [[2, 4], [6, 8]]
3   b     2  [[8, 10], [12, 14]]
>>> g.pivot(columns='foo', values=0, index='date').reset_index()
foo  date                    a                    b
0       1     [[2, 4], [6, 8]]     [[2, 4], [6, 8]]
1       2  [[8, 10], [12, 14]]  [[8, 10], [12, 14]]

要按元素求和,我使用numpy sum而不是axis=2(事先将转换后的列表转换为np.array)。另外,你的输出有点不正确 - 应该是:

date    a               b           
1    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
2    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]