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

如何将DataFrame列值转为新列并聚合对应关联字段?

Pandas按ID合并名称并将事件转为列的解决方案

你的需求是按id分组,合并同一id下的唯一名称,同时把event的不同值转为新列,对应填充合并后的reg_num。你之前的代码因为同时按id、name、event三重分组,导致无法合并同一id下的名称和注册编号,下面是正确的实现方法:

分步实现

1. 合并同一ID下的唯一名称

先按id分组,收集每个id对应的所有唯一名称,用逗号连接成字符串(这里做了排序,可根据需求去掉):

import pandas as pd

# 初始化示例DataFrame
df = pd.DataFrame({
    'id': ['1','1','2','2','2','3','3','3','3'],
    'name': ['Andi','Andy','Ben','Ben','Benjamin','Charlie','Charlie','Charlie','Charles'],
    'event': ['Basket','Basket','Basket','Soccer','Soccer','Basket','Basket','Soccer','Basket'],
    'reg_num': ['435','436','123','341','231','223','115','432','67']
})

# 合并同一id下的唯一名称
name_group = df.groupby('id')['name'].apply(lambda x: ', '.join(sorted(set(x)))).reset_index(name='Name')

2. 按ID+事件合并注册编号并转列

按id和event分组,合并对应reg_num为逗号分隔的字符串,再将event转为列:

# 合并reg_num并将event转为列,空值填充为空字符串
reg_group = df.groupby(['id', 'event'])['reg_num'].apply(lambda x: ', '.join(x)).unstack(fill_value='')

3. 合并结果并设置多级索引

将两个分组结果合并,设置id和Name为多级索引,得到目标格式:

final_df = pd.merge(name_group, reg_group, on='id').set_index(['id', 'Name'])
print(final_df)

输出结果:

Basket     Soccer
id Name                               
1  Andi, Andy        435,436          
2  Ben, Benjamin     123        341,231
3  Charlie, Charles  223,115,67     432

原代码问题分析

你之前的代码df2 = df.reset_index().groupby(['id','name','event'])['reg_num'].aggregate('first').unstack(),因为把name也作为分组键,导致同一id下不同的name会被拆成独立分组,自然无法合并名称和对应的注册编号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:20:33