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
相关产品推荐
相关产品推荐

