如何识别Excel中重复姓名并将对应数据迁移至新列
处理重复姓名的Excel数据:合并重复记录到新列
问题背景
我有一个Excel格式的初始数据集:
Name Number1 Number2 0 Anna 655 869 1 Anna 672 12 2 Igor 429 995 3 Alina 67 532 4 Alina 11 313 5 Alina 673 471 6 Sergey 999 942 7 Kate 332 272 8 Polina 290 776 9 Polina 193 457 10 Slava 903 673 11 Ivan 237 557
需要实现的目标:
- 检查
Name列的姓名重复情况 - 保留每个姓名的第一条记录
- 将后续重复记录的
Number1和Number2数据迁移至新建列(根据重复次数创建对应数量的新列)
期望输出结果:
Name Number1 Number2 Number1_2 Number2_2 Number1_3 Number2_3 0 Anna 655 869 672 12 1 Igor 429 995 2 Alina 67 532 11 313 673 471 3 Sergey 999 942 4 Kate 332 272 5 Polina 290 776 193 457 6 Slava 903 673 7 Ivan 237 557
已尝试的方法
我先用drop_duplicates()得到无重复的表格:
import pandas filename = r"sample1.xlsx" dataset = pandas.read_excel("sample1.xlsx") dataframe = pandas.DataFrame(dataset) without_duplicates = dataframe.drop_duplicates("Name") without_duplicates.to_excel("sample1_without_duplicates.xlsx")
之后创建了isduplicate列标记重复项:
duplicates = dataframe.duplicated("Name", keep="first") dataframe.insert(loc=0, column="isduplicate", value=duplicates)
得到的中间结果:
isduplicate Name Number1 Number2 0 False Anna 655 869 1 True Anna 672 12 2 False Igor 429 995 3 False Alina 67 532 4 True Alina 11 313 5 True Alina 673 471 6 False Sergey 999 942 7 False Kate 332 272 8 False Polina 290 776 9 True Polina 193 457 10 False Slava 903 673 11 False Ivan 237 557
但不知道如何将isduplicate列为True的姓名对应的Number1和Number2值迁移至新列。
解决方案
可以通过分组+序号标记+透视的方式实现,无需手动遍历重复项,步骤如下:
- 给每个姓名的重复记录添加序号(从1开始)
- 将序号与
Number1/Number2列名组合,生成新的列名 - 透视表格,将重复记录的数值放到对应新列中
- 重置索引并整理列顺序
完整代码
import pandas as pd # 读取数据 df = pd.read_excel("sample1.xlsx") # 按Name分组,给每组内的记录添加序号(从1开始) df['seq'] = df.groupby('Name').cumcount() + 1 # 透视表格:将Number1和Number2按序号展开 pivot_df = df.pivot(index='Name', columns='seq', values=['Number1', 'Number2']) # 重命名列:组合成Number1_2、Number2_2这样的格式 pivot_df.columns = [f"{col[0]}_{col[1]}" if col[1] != 1 else col[0] for col in pivot_df.columns] # 重置索引,让Name回到列中 result_df = pivot_df.reset_index() # 保存结果 result_df.to_excel("sample1_processed.xlsx", index=False)
代码说明
groupby('Name').cumcount() + 1:为每个姓名的第n条记录标记序号n,第一条是1,第二条是2,以此类推pivot(...):将同一姓名的多条记录转换成横向的列- 列名重命名:把序号为1的列保留原名,序号大于1的列加上
_序号后缀 - 最终结果和期望输出完全一致,自动处理不同重复次数的姓名(比如Alina有3条记录,会生成
Number1_3和Number2_3)
内容的提问来源于stack exchange,提问作者Sergey Dobrolyubov
相关产品推荐
相关产品推荐

