使用Pandas合并重复联系人行并追加不同公司列
使用Pandas将联系人关联的多公司信息横向展开
输入DataFrame
| CONTACT_ID | COMPANY_ID | FIRST_NAME | SURNAME | COMPANY_NAME | |
|---|---|---|---|---|---|
| 1 | 8 | Martin | GERARD | martin.gerard@gmail.com | BIG COMPANY |
| 1 | 87 | Martin | GERARD | martin.gerard@gmail.com | LITTLE COMPANY |
| 30 | 12 | Jean | DUPOND | jean.dupond@aol.com | MEGA COMPANY |
期望输出
| CONTACT_ID | FIRST_NAME | SURNAME | COMPANY_ID_1 | COMPANY_NAME_1 | COMPANY_ID_2 | COMPANY_NAME_2 | |
|---|---|---|---|---|---|---|---|
| 1 | Martin | GERARD | martin.gerard@gmail.com | 8 | BIGCOMPANY | 87 | LITTLECOMPANY |
| 30 | Jean | DUPOND | jean.dupond@aol.com | 12 | MEGACOMPANY |
注:单个联系人可关联两家以上公司,需自动生成对应序号的列。
解决方案代码
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
相关产品推荐
相关产品推荐

