Pandas:将数组求和为具有多个groupby列的聚合

时间:2016-10-03 20:19:15

标签: python pandas numpy

我正在使用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]上的其余数据中,但它似乎在那里应该是一个更简单的方法。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here