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

