按DataFrame的ID列去重分组,将同组数据合并至同一行
解决方案
实现思路
要把同一ID对应的多列信息拆分为多组对应列,核心是给每个ID组内的记录添加序号,再通过unstack操作将行数据展开为列,最后整理列名即可。
完整代码示例
假设你的原始DataFrame包含ID、Grade及其他关联列,以下是可直接复用的代码:
import pandas as pd import numpy as np # 模拟原始数据(替换成你实际的DataFrame) df = pd.DataFrame({ 'ID': ['A', 'A', 'B', 'B', 'B'], 'Grade': [85, 90, 78, 82, 88], 'Name': ['Alice', 'Alice', 'Bob', 'Bob', 'Bob'] }) # 1. 给每个ID组内的记录添加从1开始的序号 df['seq'] = df.groupby('ID').cumcount() + 1 # 2. 将ID和序号设为双层索引,再unstack展开列 df_grouped = df.set_index(['ID', 'seq']).unstack() # 3. 重命名列,生成「列名_序号」的格式 df_grouped.columns = [f'{col[0]}_{col[1]}' for col in df_grouped.columns] # 可选:将ID从索引转回普通列 df_grouped = df_grouped.reset_index() print(df_grouped)
代码说明
groupby('ID').cumcount() + 1:给每个ID下的行分配连续序号(从1开始),标记同一ID下的第n条记录。set_index(['ID', 'seq']).unstack():把ID和序号作为双层索引,再将序号层展开为列,此时列会变成(Grade,1)、(Grade,2)这类多层结构。- 列名重命名:将多层列名合并为
列名_序号的格式,完全匹配你需要的目标效果。
效果对比
你之前的代码是将Grade合并为列表,而上述方法会直接生成独立的多列(如Grade_1、Grade_2),完全符合目标格式要求。
内容的提问来源于stack exchange,提问作者Orlando
相关产品推荐
相关产品推荐

