首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python pandas聚合非数值类型

python pandas聚合非数值类型
EN

Stack Overflow用户
提问于 2013-12-03 16:13:16
回答 1查看 1.7K关注 0票数 1

我遇到了以下问题,我设法在一些列上创建了一个具有对象数据类型的数据框。具体地说,它们将是2dnumpy数组,但它们可以是任何非数值类型。现在,我想要旋转我的数据帧。有没有一种方法可以传递一个我选择的聚合函数来处理这些对象?我似乎不能做到这一点,我得到了错误:

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

例如,假设我有一个虚拟数据帧:

代码语言:javascript
复制
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]]

我想要有一个新的数据帧类型:

代码语言:javascript
复制
dd.pivot_table(values=['mat'], rows=['date'], cols=['foo'], aggfunc= ??)

其中我的2-d数组将是在'foo‘列中具有相同值的数组的逐个元素的和。我该怎么做呢?如果不可能,是否可以在具有相同'foo‘的数组列表中选择'mat’元素的第一个匹配项?谢谢

添加了所需的输出:

代码语言:javascript
复制
date    a               b           
1    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
2    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
EN

回答 1

Stack Overflow用户

发布于 2013-12-03 17:35:39

您可以先分组,然后旋转:

代码语言:javascript
复制
>>> 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 )。另外,看起来你的输出有点不正确--它应该是:

代码语言:javascript
复制
date    a               b           
1    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
2    [[2, 4], [6, 8]]  [[8, 10], [12, 14]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20345932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档