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

Pandas按多列分组后将剩余列值聚合为列表的问题求解

问题原因

你调用groupby(...).apply(list)时,传入apply的list函数的处理对象是每个分组对应的完整子DataFrame,而Python内置list()作用在DataFrame对象上时,默认返回的是该DataFrame的列名列表,不会逐列聚合行值,这就是输出结果为[id1, id2, text, metadata]的核心原因,和你预期的逐列聚合值列表完全是两个逻辑。

正确实现方案

不需要绕弯解析错误输出,直接指定逐列聚合规则即可,最简洁的写法如下:

import pandas as pd

df = pd.DataFrame(data={"id1": ["HP:001", "HP:001"], 
                   "id2": ["DO:001", "DO:001"], 
                   "text": ["text_1", "text_2"], 
                   "metadata": ["metadata_1", "metadata_2"]})

# 分组后指定需要聚合为列表的列,直接聚合
outcome = df.groupby(["id1", "id2"], as_index=False)[["text", "metadata"]].agg(list)

执行后输出结果完全符合预期:

  • id1列值:HP:001
  • id2列值:DO:001
  • text列值:['text_1', 'text_2']
  • metadata列值:['metadata_1', 'metadata_2']

如果需要自动对所有非分组列做列表聚合,不需要手动列列名,可以用lambda写法:

outcome = df.groupby(["id1", "id2"], as_index=False).agg(lambda col: col.tolist())

注意:参数as_index=False会直接把分组键作为普通列返回,不需要额外调用reset_index()重置索引,适配绝大多数pandas版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:06:21