如何在Pandas DataFrame中合并含重复标识符的行并生成新列
处理Pandas中重复ID的行合并问题
我刚好遇到过类似的需求,这里给你一个灵活适配任意重复行数的解决方案,核心思路是通过分组序号+透视表的方式,自动把同一ID的多行属性展开成对应列:
步骤详解
- 给每个ID的重复行分配序号:用
groupby.cumcount()给同一ID下的行从0开始编号,这样后续可以通过序号区分不同的重复行。 - 透视表转置列:把ID作为索引,序号作为列层级,将其他属性列转置为横向的多列。
- 调整列名格式:把层级化的列名转换成你需要的
type1、subtype1这种格式。 - 处理空值:把透视后产生的空值替换成你示例中的
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
相关产品推荐
相关产品推荐

