我正在尝试对带有列表列的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]
现在,对a
或b
进行分组可按预期工作:
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内部有关......
有任何变通方法或解释吗?
答案 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
我认为你也应该把它提交给熊猫队。