如何将Pandas DataFrame按name聚合,合并path为列表且行数匹配唯一name数
Pandas分组聚合:将相同name的path合并为列表并保证唯一name行数正确
问题背景
原DataFrame结构如下:
index name path 0 Dina "gs://my_bucket/folder1/img1.png" 1 Dina "gs://my_bucket/folder1/img2.png" 2 Lane "gs://my_bucket/folder1/img3.png" 3 Bari "gs://my_bucket/folder1/img4.png" 4 Andrew "gs://my_bucket/folder1/img5.png" 5 Andrew "gs://my_bucket/folder1/img6.png" 6 Andrew "gs://my_bucket/folder1/img7.png" 7 Beti "gs://my_bucket/folder1/img7.png" 8 Ladin "gs://my_bucket/folder1/img5.png" ...
需求:生成新DataFrame,每个唯一name仅出现一次,path列为该name对应的所有path组成的列表,结果行数需等于原DataFrame中唯一name的数量。
原代码错误分析
提供的代码存在两处关键问题,导致name重复、行数不符合预期:
- 语法错误:
groupby(['name'))括号不匹配,应为groupby(['name'])或groupby('name') - 错误分组键:代码注释提到按
name和dili分组,但原DataFrame中无dili列,错误的分组逻辑会破坏唯一name的聚合效果
正确解决方案
方案1:保留所有path(不去重)
直接使用Pandas内置的list作为聚合函数,配合as_index=False参数确保分组后直接生成目标结构:
# 按name分组,将每个name对应的path合并为列表 result = df.groupby('name', as_index=False)['path'].agg(list)
方案2:对每个name的path去重
如果需要去除同一name下的重复path,使用lambda函数结合set去重:
# 按name分组,合并path为列表并去重 result = df.groupby('name', as_index=False)['path'].agg(lambda x: list(set(x)))
结果验证
执行后可以通过以下代码确认行数是否符合预期:
# 检查结果行数是否等于原DataFrame中唯一name的数量 assert len(result) == df['name'].nunique()
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

