Python 如何使用多索引在pandas中聚合到列表中?

Python 如何使用多索引在pandas中聚合到列表中?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有这样一个数据帧: class1 class2 values values2 0 1 0 1 5 1 1 1 2 8 2 1 0 3 3 3 2 0 5 6 4 2 0 2 5 5 2 1

我有这样一个数据帧:

    class1  class2  values  values2
0        1       0       1        5
1        1       1       2        8
2        1       0       3        3
3        2       0       5        6
4        2       0       2        5
5        2       1       4        2
6        2       1       2        3
7        2       1       3        1
8        3       0       1        3
9        3       0       3        3
10       3       1       4        2
11       3       1       2        4
我希望基于
class1
class2
设置多索引,然后将
value
value2
聚合到列表中。因此,我想得到结果应该是这样的:

   class1  class2     values    values2
0       1       0     [1, 3]     [5, 3]
1       1       1        [2]        [8]
2       2       0     [5, 2]     [6, 5]
3       2       1  [4, 2, 3]  [2, 3, 1]
4       3       0     [1, 3]     [3, 3]
5       3       1     [4, 2]     [2, 4]
我尝试通过以下方式完成:

df.groupby(['class1']).agg(lambda x: x.tolist()).reset_index()
df.groupby(['class1', 'class2'])['values'].apply(lambda x: x.tolist()).reset_index()
没问题。但我尝试了多重索引:

df.groupby(['class1','class2']).agg(lambda x: x.tolist()).reset_index()
显示错误:

ValueError:函数未减少

我还尝试了以下方法:

df.groupby(['class1']).agg(lambda x: x.tolist()).reset_index()
df.groupby(['class1', 'class2'])['values'].apply(lambda x: x.tolist()).reset_index()
此方法只能针对
value
Value2
单独处理


有谁能帮我找到更好的方法吗?提前感谢

您可以使用
元组
进行聚合,然后使用
applymap
转换为
列表

df.groupby(['class1', 'class2']).agg(tuple).applymap(list).reset_index()

   class1  class2     values    values2
0       1       0     [1, 3]     [5, 3]
1       1       1        [2]        [8]
2       2       0     [5, 2]     [6, 5]
3       2       1  [4, 2, 3]  [2, 3, 1]
4       3       0     [1, 3]     [3, 3]
5       3       1     [4, 2]     [2, 4]

有趣的是,我无法复制您的问题,
df.groupby(['class1','class2']).agg(lambda x:x.tolist()).reset_index()
工作正常,正如:
df.groupby(['class1','class2']).agg(list.reset_index()
您运行的熊猫版本是什么?@AChampion我使用的是0.22.0。你是对的。当我升级到0.23.0.Does
df.groupby(['class1','class2']).agg(list).reset_index()
不适用于您?正确的
功能不会减少
。Pandas希望聚合器的结果是简化形式。列表被确定为不缩减,而tuple则是。您使用的pandas版本是什么,因为这会为我返回完全相同的结果(
0.23.0
)。这里似乎已修复: