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