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.Doesdf.groupby(['class1','class2']).agg(list).reset_index()
不适用于您?正确的功能不会减少
。Pandas希望聚合器的结果是简化形式。列表被确定为不缩减,而tuple则是。您使用的pandas版本是什么,因为这会为我返回完全相同的结果(0.23.0
)。这里似乎已修复: