在对多列

时间:2016-10-24 18:10:48

标签: python combinatorics

我正在尝试对带有列表列的Pandas数据帧执行简单的groupby操作(目标是连接与每个组对应的列表)。它在单个列上分组时工作正常,但由于两个列分组时我无法解释失败的原因。一个简化的例子:

x = pd.DataFrame({'a':[1,1,2,2],'b':['a','a','a','b'],'c':[[1,2],[3,4],[5,6],[7,8]]})

   a  b       c
0  1  a  [1, 2]
1  1  a  [3, 4]
2  2  a  [5, 6]
3  2  b  [7, 8]

现在,对ab进行分组可按预期工作:

x.groupby('b')['c'].sum()

b
a    [1, 2, 3, 4, 5, 6]
b                [7, 8]
dtype: object

x.groupby('a')['c'].sum()

a
1    [1, 2, 3, 4]
2    [5, 6, 7, 8]
dtype: object

但是,如果我尝试对a AND b(即x.groupby(['a','b'])['c'].sum())进行分组,则ValueError: Function does not reduce总是失败。

从表面上看,我无法理解为什么会发生这种情况,因为我们只是连接列表,但我认为它与Pandas内部有关......

有任何变通方法或解释吗?

1 个答案:

答案 0 :(得分:2)

我认为这可能是一个错误,当某些行无法求和时,sum会失败,例如最后两个将继续与双重分组。解决方法适用:

import pandas as pd
x = pd.DataFrame({'a':[1,1,2,2],'b':['a','a','a','b'],'c':[[1,2],[3,4],[5,6],[7,8]]})
print x
   a  b       c
0  1  a  [1, 2]
1  1  a  [3, 4]
2  2  a  [5, 6]
3  2  b  [7, 8]
print  x.groupby(('a'))['c'].apply(sum)
a
1    [1, 2, 3, 4]
2    [5, 6, 7, 8]
Name: c, dtype: object
print x.groupby(('a'))['c'].sum()
a
1    [1, 2, 3, 4]
2    [5, 6, 7, 8]
dtype: object
print x.groupby(('a','b'))['c'].apply(sum)
a  b
1  a    [1, 2, 3, 4]
2  a          [5, 6]
   b          [7, 8]
Name: c, dtype: object

我认为你也应该把它提交给熊猫队。