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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:06:06