Pandas 对多列进行分组时使用 groupby 连接列表列
Pandas concatenate list columns with groupby when grouping on multiple columns
我正在尝试对具有列表列的 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
和 b
(即 x.groupby(['a','b'])['c'].sum()
)进行分组,它总是会因 ValueError: Function does not reduce
而失败。
从表面上看,我不明白为什么会发生这种情况,因为无论哪种方式我们都只是连接列表,但我想这与 Pandas 内部结构有关...
任何解决方法或解释?
我认为这可能是一个错误,当无法对某些行求和时求和失败,例如最后两行将与双分组保持拆分。解决方法是应用:
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
我认为你也应该将此提交给 pandas 团队。
我正在尝试对具有列表列的 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
和 b
(即 x.groupby(['a','b'])['c'].sum()
)进行分组,它总是会因 ValueError: Function does not reduce
而失败。
从表面上看,我不明白为什么会发生这种情况,因为无论哪种方式我们都只是连接列表,但我想这与 Pandas 内部结构有关...
任何解决方法或解释?
我认为这可能是一个错误,当无法对某些行求和时求和失败,例如最后两行将与双分组保持拆分。解决方法是应用:
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
我认为你也应该将此提交给 pandas 团队。