【问题标题】:python pandas aggregating non numeric typespython pandas聚合非数字类型
【发布时间】:2013-12-03 08:13:15
【问题描述】:

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

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

添加了所需的输出:

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

【问题讨论】:

  • 请添加示例输出
  • 好吧,我得到一个错误,所以输出会是这样的: raise GroupByError('No numeric types to aggregate') GroupByError: No numeric types to aggregate
  • 我的意思是你想得到什么作为输出,结果 DataFrame
  • 知道了,它就在那里,基本上是对二维数组求和,但实际上它可以是任何聚合函数
  • 这不是一种非常有效的数据表示。查看多索引,请参阅:pandas.pydata.org/pandas-docs/dev/…,或将“mat”数据放在单独的数据框中。

标签: python arrays numpy pandas aggregate


【解决方案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]]

要按元素求和,我在 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]]

【讨论】:

  • 我认为您应该可以使用sum(axis=0) 而不是.T.sum(axis=2).T
  • import pandas as pd import sys,ast input_str = sys.stdin.read() input_list = ast.literal_eval(input_str) cols=input_list[0] values=input_list[1] df=pd.read_csv('https://media-doselect.s3.amazonaws.com/generic/wkyk2AWYdJbqgXoRo3Y8w42nX/test.csv') print(df.groupby(cols).get_group(tuple(values)).head())
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2021-07-28
  • 2014-11-23
  • 2017-01-27
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多