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

如何在Pandas DataFrame中对多列分组并将行值合并为列表?

Pandas分组聚合多列为列表的解决方案

原始数据与需求

原始DataFrame创建代码

import pandas as pd
d = {'Name': ['DataSource', 'DataSource'], 'DomainCode': ['Pr', 'Gov'], 'DomainName': ['Private', 'Government']}
df = pd.DataFrame(data=d)

原始数据内容

Name DomainCode  DomainName
0  DataSource         Pr     Private
1  DataSource        Gov  Government

需求

按Name列分组,将DomainCode和DomainName列的行值分别合并为列表,得到如下结果:

Name DomainCode               DomainName
0  DataSource  [Pr, Gov]  [Private, Government]

问题解决

1. 同时处理多列的分组聚合

要实现多列同时合并为列表,有两种高效方式:

方法一:使用agg(list)(推荐,性能更优)

直接对分组后的DataFrame调用agg(list),指定不将分组列设为索引:

df_result = df.groupby("Name", as_index=False).agg(list)

执行后即可得到目标结果,所有指定列(这里是除Name外的所有列)都会被合并为对应分组的列表。

方法二:使用apply自定义逻辑

如果需要更灵活的列选择,可通过lambda函数指定要处理的列:

df_result = df.groupby("Name").apply(lambda x: x[["DomainCode", "DomainName"]].agg(list)).reset_index()

2. 解决列表长度为1的问题

你之前得到长度为1的列表,通常是以下两种原因:

  • 原始DataFrame中对应分组的Name下,目标列只有唯一值
  • 分组操作时错误过滤了数据,导致分组内仅保留一行

可以先执行以下代码确认每个分组的行数:

print(df.groupby("Name").size())

如果输出显示对应分组行数为2,但聚合后列表长度为1,检查是否在分组前对数据做了去重或过滤操作。只要原始分组有N行,使用上述聚合方法就能得到长度为N的列表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:25:58