我有以下问题,我设法在某些列上创建一个带有对象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]]
答案 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]]