【问题标题】:Pandas: Summing arrays as as an aggregation with multiple groupby columnsPandas:将数组求和作为具有多个 groupby 列的聚合
【发布时间】:2017-02-11 21:05:23
【问题描述】:

我正在使用 Python 3.5.1 和 Pandas 0.18.0。

假设我有一个包含多列的 Pandas 数据框。数据框有一列包含一个 numpy 数组。这是一个例子:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame([{'A': 'Label1', 'B': 'yellow', 'C': np.array([0,0,0]), 'D': 1},
                       {'A': 'Label2', 'B': 'yellow', 'C': np.array([1,1,1]), 'D': 4},
                       {'A': 'Label1', 'B': 'yellow', 'C': np.array([1,0,1]), 'D': 2},
                       {'A': 'Label2', 'B': 'green', 'C': np.array([1,1,0]), 'D': 3}])
>>> df
        A       B          C  D
0  Label1  yellow  [0, 1, 0]  1
1  Label2  yellow  [1, 1, 1]  4
2  Label1  yellow  [1, 0, 1]  2
3  Label2   green  [1, 1, 0]  3

我想创建一个按列 A 和 B 分组的数据框,并将列 C 和 D 与总和聚合在一起。 像这样:

               C         D
A      B
Label1 yellow  [1, 1, 1] 3
Label2 green   [1, 1, 0] 3
       yellow  [1, 1, 1] 4

当我尝试使用整个数据框进行聚合时,不返回 C 列(带有 numpy 数组的列):

>>> df.groupby(['A','B']).sum()
               D
A      B
Label1 yellow  3
Label2 green   3
       yellow  4

如果我忽略 D 列而只尝试输出 C 列,则会收到错误消息:

>>> df[['A','B','C']].groupby(['A','B']).sum()
Traceback (most recent call last):
  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 96, in f
    return self._cython_agg_general(alias, numeric_only=numeric_only)
  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3038, in _cython_agg_general
    how, numeric_only=numeric_only)
  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3084, in _cython_agg_blocks
    raise DataError('No numeric types to aggregate')
pandas.core.base.DataError: No numeric types to aggregate

如果我只按单个列分组并且只输出我的数组列,则数组总和正确:

>>> df[['A','C']].groupby(['A']).sum()
                C
A
Label1  [1, 1, 1]
Label2  [2, 2, 1]

但如果我尝试将标量列也包含为聚合,我的数组列也不会返回:

>>> df[['A','C','D']].groupby(['A']).sum()
        D
A
Label1  3
Label2  7

另外,如果我尝试在聚合函数中包含 B 列(包含字符串),B 列和 C 列会返回,但 D 列不会:

>>> df[['A','B','C']].groupby(['A']).sum()
               B          C
A
Label1  yellowyellow  [1, 1, 1]
Label2   yellowgreen  [2, 2, 1]

谁能解释为什么会这样?我知道我可以创建一个 [A+B] 列,然后按该列分组,对我的数组列求和,然后将结果与我在列 [A+B] 上的其余数据合并,但似乎在那里应该是一个更简单的方法。有什么想法吗?

【问题讨论】:

  • '用总和聚合列 C 和 D' 是不明确的。请显示您的预期输出。
  • 所以您知道,您显示的df 与您构建的不一样。
  • 我更改了 numpy 数组中的一些值,但输出也应该更新。

标签: python pandas numpy


【解决方案1】:

pd.concat 单独的 groupbys 是一种解决方法

g = df.groupby(['A', 'B'])
pd.concat([g.C.apply(np.sum), g.D.sum()], axis=1)

【讨论】:

  • 好的,我更新了问题以显示我想要的输出。
猜你喜欢
  • 2020-11-05
  • 2021-11-01
  • 1970-01-01
  • 2020-11-04
  • 2019-06-08
  • 2023-03-07
  • 2019-10-12
  • 1970-01-01
  • 2017-12-25
相关资源
最近更新 更多