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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:18