如何将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
相关产品推荐
相关产品推荐

