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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:37:18