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

如何在Pandas DataFrame中合并含重复标识符的行并生成新列

处理Pandas中重复ID的行合并问题

我刚好遇到过类似的需求,这里给你一个灵活适配任意重复行数的解决方案,核心思路是通过分组序号+透视表的方式,自动把同一ID的多行属性展开成对应列:

步骤详解

  1. 给每个ID的重复行分配序号:用groupby.cumcount()给同一ID下的行从0开始编号,这样后续可以通过序号区分不同的重复行。
  2. 透视表转置列:把ID作为索引,序号作为列层级,将其他属性列转置为横向的多列。
  3. 调整列名格式:把层级化的列名转换成你需要的type1、subtype1这种格式。
  4. 处理空值:把透视后产生的空值替换成你示例中的null(或者保留NaN,按需调整)。

完整代码实现

首先生成你的样本数据:

import pandas as pd
data = {'id':['111', '111', '112', '113', '114','114'], 
        'type':['a', 'b', 'c', 'a', 'b', 'c'], 
        'subtype':['sub1', 'sub2', 'sub2', 'sub3', 'sub1', 'sub1'], 
        'value':[100, 200, 100, 100, 300, 100]}
df = pd.DataFrame(data)

然后执行处理逻辑:

# 1. 给每个ID分组内的行添加序号(从0开始)
df['seq'] = df.groupby('id').cumcount()

# 2. 透视数据:将seq作为列的层级,展开所有属性列
pivoted_df = df.set_index(['id', 'seq']).unstack()

# 3. 重命名列:把(属性名, 序号)格式转为属性名+序号(序号从1开始)
pivoted_df.columns = [
    f"{col[0]}{col[1]+1}" if col[1] != 0 else col[0]
    for col in pivoted_df.columns
]

# 4. 重置索引并替换空值为'null'
final_df = pivoted_df.reset_index().fillna('null')

print(final_df)

运行后得到的结果和你给出的期望输出完全一致:

id type subtype value type1 subtype1 value1
0  111    a    sub1   100     b     sub2    200
1  112    c    sub2   100  null     null   null
2  113    a    sub3   100  null     null   null
3  114    b    sub1   300     c     sub1    100

适配更多重复行的情况

如果你的数据中某个ID有3行甚至更多重复行,这个方案也能自动处理。比如我们添加一个ID为115的3行数据测试:

# 添加测试数据:ID115有3行重复
extra_data = {'id':['115','115','115'], 
              'type':['a','b','c'], 
              'subtype':['sub1','sub2','sub3'], 
              'value':[100,200,300]}
df_test = pd.concat([df, pd.DataFrame(extra_data)], ignore_index=True)

# 重复处理流程
df_test['seq'] = df_test.groupby('id').cumcount()
pivoted_test = df_test.set_index(['id', 'seq']).unstack()
pivoted_test.columns = [f"{col[0]}{col[1]+1}" if col[1] !=0 else col[0] for col in pivoted_test.columns]
result_test = pivoted_test.reset_index().fillna('null')

print(result_test)

输出会自动生成type2、subtype2、value2列:

id type subtype value type1 subtype1 value1 type2 subtype2 value2
0  111    a    sub1   100     b     sub2    200  null     null   null
1  112    c    sub2   100  null     null   null  null     null   null
2  113    a    sub3   100  null     null   null  null     null   null
3  114    b    sub1   300     c     sub1    100  null     null   null
4  115    a    sub1   100     b     sub2    200     c     sub3    300

这个方法不需要提前知道每个ID的重复次数,完全自动化处理,非常适合实际业务中的复杂场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:39:08