我遇到了以下问题,我设法在一些列上创建了一个具有对象数据类型的数据框。具体地说,它们将是2dnumpy数组,但它们可以是任何非数值类型。现在,我想要旋转我的数据帧。有没有一种方法可以传递一个我选择的聚合函数来处理这些对象?我似乎不能做到这一点,我得到了错误:
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]]发布于 2013-12-03 17:35:39
您可以先分组,然后旋转:
>>> 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]]为了按元素求和,我在axis=2上使用了numpy sum (预先将列表转换为np.array )。另外,看起来你的输出有点不正确--它应该是:
date a b
1 [[2, 4], [6, 8]] [[8, 10], [12, 14]]
2 [[2, 4], [6, 8]] [[8, 10], [12, 14]]https://stackoverflow.com/questions/20345932
复制相似问题