【发布时间】: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 数组中的一些值,但输出也应该更新。