Pandas用unstack/pivot实现同ID关联行横向拼接的解决方案咨询
实现代码
1. 测试数据构造(可跳过直接使用你的实际DataFrame)
import pandas as pd data = [ [2, 'Self', 'Vegeta', 'Saiyan', '01/01/1949', 'Saiyan Planet', '123-456-7891'], [2, 'Spouse', 'Bulma', 'Saiyan', '04/20/1969', 'Saiyan Planet', '123-456-7891'], [3, 'Self', 'Krilin', 'Human', '08/21/1992', 'Planet Earth', '789-456-4321'], [4, 'Self', 'Goku', 'Kakarot', '05/04/1975', 'Planet Earth', '321-654-9870'], [4, 'Child', 'Gohan', 'Kakarot', '04/02/2001', 'Planet Earth', '321-654-9870'], [5, 'Self', 'Freezer', 'Fridge', '09/15/1955', 'Deep Space', '456-788-9568'] ] cols = ['ID', 'Relationship', 'First Name', 'Last Name', 'DOB', 'Address', 'Phone'] df = pd.DataFrame(data, columns=cols)
2. 核心转换逻辑
# 自定义配置:根据你的实际字段调整即可 common_cols = ['ID', 'Address', 'Phone'] # 同ID下取值一致的公共字段 expand_cols = ['First Name', 'Last Name', 'DOB'] # 需要按关系扩展的字段 # 提取每个ID的Self行作为基础表 base_df = df[df['Relationship'] == 'Self'].reset_index(drop=True) # 处理非Self行,转换为宽表 expand_df = df[df['Relationship'] != 'Self']\ .set_index(['ID', 'Relationship'])[expand_cols]\ .unstack(level=1) # 拼接新列名:关系类型_原字段名 expand_df.columns = [f'{rel}_{col}' for col, rel in expand_df.columns] expand_df = expand_df.reset_index() # 合并基础表和扩展表,空值填充为空字符串 result = pd.merge(base_df, expand_df, on='ID', how='left').fillna('')
逻辑说明
- 先把每个ID的主记录(Relationship为Self)单独提出来作为基础表,保留所有原始字段
- 对非Self的关联记录,先按ID和关系类型做索引,通过
unstack把关系类型转为列维度,再拼接生成你需要的扩展列名 - 最后按ID关联两张表,缺失的扩展字段会自动填充为空,和你要求的输出完全一致
- 实际场景中如果有更多公共字段/需要扩展的字段,只需要修改
common_cols和expand_cols两个列表即可,不需要调整其他逻辑
内容的提问来源于stack exchange,提问作者rekeson21
相关产品推荐
相关产品推荐

