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

pandas groupby分组聚合如何实现同组不同值去重拼接

pandas分组聚合实现列值去重后逗号拼接

你代码里写的.gg是笔误,实际通过.agg接口自定义聚合函数即可实现需求,只需要把Example_extra_col对应的聚合规则从'first'替换为去重后拼接的逻辑即可。

完整实现代码

import pandas as pd

data = [
    ['ACOT', '00001', '', '', 1.5, 20, 30, 'AA'],
    ['ACOT', '00002', '', '', 1.7, 20, 33,'BB'],
    ['ACOT', '00003', '','NA_0001' ,1.4, 20, 40,'AA'],
    ['PAN', '000090', 'canonical', '', 0.5, 10, 30,'DD'],
    ['PAN', '000091', '', '', 0.4, 10, 30,'CC'],
    ['TOM', '000080', 'canonical', '', 0.4, 10, 15,'EE'],
    ['TOM', '000040', '', '', 1.7, 10, 300,'EE']
]

df = pd.DataFrame(data, columns=[
    'Gene_name', 'Transcript_ID', 'canonical', 'mane', 'metrics','start','end', 'Example_extra_col'])

out = (df
 .groupby('Gene_name', as_index=False)
 .agg({'canonical': 'any',
       'mane': 'any',
       'metrics': lambda x: f'{x.min()}-{x.max()}',
       # 核心修改:去重后按首次出现顺序用逗号拼接
       'Example_extra_col': lambda x: ','.join(pd.unique(x)),
      })
 .replace({True: 'Yes', False: 'No'})
)

逻辑说明

  • pd.unique(x)会返回分组内该列去重后的值,且保留值第一次出现的顺序,和期望输出的顺序完全匹配
  • ','.join()负责把去重后的序列拼接为逗号分隔的字符串
  • 运行后输出结果和预期完全一致:
Gene_name canonical mane  metrics Example_extra_col
0      ACOT        No  Yes  1.4-1.7             AA,BB
1       PAN       Yes   No  0.4-0.5             DD,CC
2       TOM       Yes   No  0.4-1.7                EE

补充:如果列中存在空值/空字符串,可以在去重前增加过滤逻辑,比如写为lambda x: ','.join([v for v in pd.unique(x) if v != ''])即可过滤空值后再拼接。

内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:39:32