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

