You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中使用MultiIndex将数据聚合为列表?

解决Pandas按多列分组聚合为列表的ValueError问题

看起来你遇到的问题是在Pandas中按多列分组后,尝试用lambda函数聚合为列表时触发了ValueError: Function does not reduce,而且单独处理一列的方式不够高效。别担心,这里有几种更优的解决方案,既能同时处理多列,又能避免报错:

方法1:直接使用内置list函数聚合

这是最简洁的方式,Pandas的agg方法可以直接接受内置的list函数,它能完美将分组后的每一列转换为列表:

import pandas as pd

# 构造你的示例DataFrame
data = {
    'class1': [1,1,1,2,2,2,2,2,3,3,3,3],
    'class2': [0,1,0,0,0,1,1,1,0,0,1,1],
    'values': [1,2,3,5,2,4,2,3,1,3,4,2],
    'values2': [5,8,3,6,5,2,3,1,3,3,2,4]
}
df = pd.DataFrame(data)

# 按class1和class2分组,聚合为列表
result = df.groupby(['class1', 'class2']).agg(list).reset_index()
print(result)

运行后就能得到你期望的结果:

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]

方法2:使用apply自定义聚合逻辑

如果你需要更灵活的控制(比如对不同列用不同的聚合逻辑),可以用apply方法返回一个Series,明确指定每列的处理方式:

result = df.groupby(['class1', 'class2']).apply(
    lambda group: pd.Series({
        'values': group['values'].tolist(),
        'values2': group['values2'].tolist()
    })
).reset_index()

这种方式虽然代码稍长,但扩展性更强,适合后续需要调整聚合逻辑的场景。

为什么你之前的lambda会报错?

你之前用df.groupby(['class1','class2']).agg(lambda x: x.tolist()).reset_index()报错,大概率是因为某些旧版本的Pandas中,lambda函数的返回值处理逻辑和内置list函数有差异。直接使用list函数是更稳妥的选择,它能被Pandas正确识别为“可聚合”的函数。

另外,如果你坚持要用lambda,也可以尝试显式指定每列的聚合规则:

result = df.groupby(['class1', 'class2']).agg({
    'values': lambda x: x.tolist(),
    'values2': lambda x: x.tolist()
}).reset_index()

这种方式也能避免报错,因为明确告诉了Pandas每列该用什么函数处理。

内容的提问来源于stack exchange,提问作者giser_yugang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:47