在Pandas中按ID列合并多列值至单个Type列
问题描述
现有数据集:
import pandas as pd df = pd.DataFrame({ 'Name': ['TOM','TOM','DOM','DOM','DOM'], 'ID': ['a101','a101','b102','b102','b102'], 'Col1': ['Alpha','Alpha','Beta','Beta','Delta'], 'Col2': ['CLT','VERON','CLT','VERON','VERON'], 'Col3': ['FLA','SLG','SLG','DT-I','DT-I'] })
需要按ID列合并多列的取值,生成如下格式的输出表:
Name ID Type TOM a101 Alpha TOM a101 CLT TOM a101 FLA TOM a101 VERON TOM a101 SLG DOM b102 Beta DOM b102 VERON DOM b102 DT-I DOM b102 Delta
解决方案
方法一:分组聚合后展开
先按Name和ID分组,收集各列的唯一值并合并,再展开为多行:
# 分组提取各列唯一值 grouped = df.groupby(['Name', 'ID']).agg({ col: lambda x: list(set(x)) for col in ['Col1', 'Col2', 'Col3'] }).reset_index() # 合并三列的取值列表 grouped['Type'] = grouped[['Col1', 'Col2', 'Col3']].sum(axis=1) # 展开列表得到最终结果 result = grouped.explode('Type')[['Name', 'ID', 'Type']] print(result)
方法二:转长格式后去重(更简洁)
将需要合并的列转为长格式,再去重保留唯一组合:
# 把Col1/Col2/Col3转为长格式,保留Name和ID作为标识列 melted_df = df.melt( id_vars=['Name', 'ID'], value_vars=['Col1', 'Col2', 'Col3'], value_name='Type' ) # 去重并整理列顺序 result = melted_df.drop_duplicates(subset=['Name', 'ID', 'Type'])[['Name', 'ID', 'Type']] print(result)
两种方法执行后都会得到符合要求的输出:
Name ID Type 0 TOM a101 Alpha 0 TOM a101 CLT 0 TOM a101 FLA 0 TOM a101 VERON 0 TOM a101 SLG 1 DOM b102 Beta 1 DOM b102 VERON 1 DOM b102 DT-I 1 DOM b102 Delta
内容的提问来源于stack exchange,提问作者Andre_k
相关产品推荐
相关产品推荐

