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

使用Pandas合并重复联系人行并追加不同公司列

使用Pandas将联系人关联的多公司信息横向展开

输入DataFrame

CONTACT_IDCOMPANY_IDFIRST_NAMESURNAMEEMAILCOMPANY_NAME
18MartinGERARDmartin.gerard@gmail.comBIG COMPANY
187MartinGERARDmartin.gerard@gmail.comLITTLE COMPANY
3012JeanDUPONDjean.dupond@aol.comMEGA COMPANY

期望输出

CONTACT_IDFIRST_NAMESURNAMEEMAILCOMPANY_ID_1COMPANY_NAME_1COMPANY_ID_2COMPANY_NAME_2
1MartinGERARDmartin.gerard@gmail.com8BIGCOMPANY87LITTLECOMPANY
30JeanDUPONDjean.dupond@aol.com12MEGACOMPANY

注:单个联系人可关联两家以上公司,需自动生成对应序号的列。

解决方案代码

import pandas as pd

# 构造输入数据
df = pd.DataFrame({
    'CONTACT_ID': [1, 1, 30],
    'COMPANY_ID': [8, 87, 12],
    'FIRST_NAME': ['Martin', 'Martin', 'Jean'],
    'SURNAME': ['GERARD', 'GERARD', 'DUPOND'],
    'EMAIL': ['martin.gerard@gmail.com', 'martin.gerard@gmail.com', 'jean.dupond@aol.com'],
    'COMPANY_NAME': ['BIG COMPANY', 'LITTLE COMPANY', 'MEGA COMPANY']
})

# 可选:去掉公司名称中的空格,匹配期望输出格式
df['COMPANY_NAME'] = df['COMPANY_NAME'].str.replace(' ', '')

# 按联系人分组,给每个联系人下的公司分配序号
df['seq'] = df.groupby('CONTACT_ID').cumcount() + 1

# 透视表实现横向展开
pivoted = df.pivot(
    index=['CONTACT_ID', 'FIRST_NAME', 'SURNAME', 'EMAIL'],
    columns='seq',
    values=['COMPANY_ID', 'COMPANY_NAME']
)

# 重命名列,生成COMPANY_ID_1、COMPANY_NAME_1格式的列名
pivoted.columns = [f'{col[0]}_{col[1]}' for col in pivoted.columns]

# 重置索引,将多级索引转为普通列,空值转为空字符串
result = pivoted.reset_index().fillna('')

print(result)

代码说明

  • 处理公司名称(可选):用str.replace(' ', '')去掉公司名称中的空格,完全匹配期望输出格式。
  • 添加序号列:通过groupby('CONTACT_ID').cumcount()+1给每个联系人下的公司从1开始编号,区分同一联系人的不同关联公司。
  • 透视表转换:以联系人的唯一标识(CONTACT_ID、姓名、邮箱)为索引,序号为列字段,将公司ID和名称横向展开。
  • 列名重命名:把透视表生成的多级列名(如(COMPANY_ID,1))转为COMPANY_ID_1的直观格式。
  • 空值处理:用fillna('')将无关联公司的位置转为空字符串,贴合输出示例。

该方案支持任意数量的关联公司,会自动生成对应序号的列,无需手动指定最大公司数量。

内容的提问来源于stack exchange,提问作者MDUB77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:16