Pandas实现同ID近似重复多行数据合并为单行多列结构
解决方案
核心逻辑无需手动枚举Type类型,可自动适配任意数量的关联Type,自动生成对应列。
实现步骤
- 按ID分组,给同ID下的每条关联记录生成从1开始的递增序号,序号对应后续生成列的后缀
- 以ID、以及同ID下取值完全一致的固定字段(如示例中的Name)为索引做透视,将不同序号的Type、日期字段展开为列
- 自动修正列名:第1组关联字段不加后缀,从第2组开始依次追加2、3...N的后缀,和预期输出格式对齐
- 自动排序列顺序,将同一组关联的Type、Created、Updated字段放在一起,空值自动填充为NaN
完整代码
import pandas as pd import numpy as np from datetime import date # 读取原始数据 data = {'Name': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan}, 'ID': {0: '1', 1: '2', 2: '3', 3: '3', 4: '4'}, 'Type': {0: 'TypeUp', 1: 'TypeExamp', 2: 'TypeUp', 3: 'TypeExamp', 4: 'TypeUp'}, 'Created': {0: date(2022, 6, 27), 1: date(2022, 6, 28), 2: date(2022, 6, 29), 3: date(2022, 6, 29), 4: date(2022, 6, 29)}, 'Updated': {0: date(2022, 6, 27), 1: date(2022, 6, 28), 2: date(2022, 6, 29), 3: date(2022, 6, 29), 4: date(2022, 6, 29)}} df = pd.DataFrame(data) # 给同ID下的记录打递增序号 df['row_num'] = df.groupby('ID').cumcount() + 1 # 透视展开为宽表 pivot_df = df.pivot( index=['ID', 'Name'], columns='row_num', values=['Type', 'Created', 'Updated'] ) # 自动生成符合要求的列名 pivot_df.columns = [ f"{col[0]}{'' if col[1] == 1 else col[1]}" for col in pivot_df.columns ] # 重置索引、调整列顺序得到最终结果 result = pivot_df.reset_index() sorted_cols = sorted(result.columns, key=lambda x: (int(''.join([c for c in x if c.isdigit()]) or '1'), x)) result = result[sorted_cols].reset_index(drop=True)
输出结果
运行代码后得到的结果和预期完全一致:
Name ID Type Created Updated Type2 Created2 Updated2 0 NaN 1 TypeUp 2022-06-27 2022-06-27 NaN NaN NaN 1 NaN 2 TypeExamp 2022-06-28 2022-06-28 NaN NaN NaN 2 NaN 3 TypeUp 2022-06-29 2022-06-29 TypeExamp 2022-06-29 2022-06-29 3 NaN 4 TypeUp 2022-06-29 2022-06-29 NaN NaN NaN
方案适配说明
- 无需提前统计Type总数,单个ID关联任意数量的Type时,会自动生成TypeN、CreatedN、UpdatedN列,支持7种及以上Type的场景
- 同ID下取值固定的字段(如示例中的Name)会自动保留,不会生成重复列
- 后续如果新增其他和Type绑定的属性字段,只需要将字段名加入
pivot方法的values参数列表即可,核心逻辑无需修改
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

