合并带有Pandas的行并追加不同的列

iezvtpos  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(114)

我有以下 Dataframe :
| 联系人ID|公司ID|名字|姓氏|电子邮件|公司名称|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 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 |
我想用Pandas把它转换成这样:
| 联系人ID|名字|姓氏|电子邮件|公司编号1|公司名称1|公司编号2|公司名称2|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 1 | Martin | GERARD | martin.gerard@gmail.com | 8 | BIGCOMPANY | 87 | LITTLECOMPANY |
| 三十|让|杜邦|让·杜庞德aol.com超级公司| 12 | MEGA COMPANY |||
一个联系人甚至可以有两个以上的公司。

mpgws1up

mpgws1up1#

创建用于创建组的列列表,然后将其转换为按DataFrame.set_index索引和按GroupBy.cumcount计数,按DataFrame.unstackDataFrame.sort_index整形,展平MultiIndex,最后将级别从列表转换为列:

cols = ['CONTACT_ID','FIRST_NAME','SURNAME','EMAIL']

df = (df.set_index([*cols, df.groupby(cols).cumcount().add(1)])
        .unstack(fill_value='')
        .sort_index(axis=1, level=1,sort_remaining=False))

df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
df = df.reset_index()
print (df)
   CONTACT_ID FIRST_NAME SURNAME                    EMAIL COMPANY_ID_1  \
0           1     Martin  GERARD  martin.gerard@gmail.com            8   
1          30       Jean  DUPOND      jean.dupond@aol.com           12   

  COMPANY_NAME_1 COMPANY_ID_2  COMPANY_NAME_2  
0    BIG COMPANY           87  LITTLE COMPANY  
1   MEGA COMPANY

相关问题