如何识别DataFrame中person_id列重复行并将其移至原行相邻位置
Pandas 按person_id横向展开重复行实现方案
核心实现逻辑
该需求本质是按person_id分组聚合,将同组内纵向排列的重复行,转换为同一行内的横向列展示,仅保留每组首次出现的person_id作为锚点,同组后续记录的字段值依次向右侧拼接,和你提供的输出示例结构完全对齐。
落地流程拆分:
- 按person_id对所有行分组,为组内每一行生成从0开始的顺序序号
- 通过透视转换,将组内纵向的行转为横向的列维度
- 匹配你示例的列名规则:组内第0行(首次出现的行)使用原始列名,后续行仅
unique_id列追加数字后缀,其余字段列名保持原样 - 调整行的排序逻辑,让最终行顺序和原始表中首次出现各person_id的顺序完全一致
可直接运行的代码示例
首先构造和你给出的结构完全一致的原始测试表:
import pandas as pd df = pd.DataFrame( [ [92, 11, "apple", "silver", "Miller"], [93, 12, "cherry", "bronze", "Gus"], [967, 121, "orange", "purple", "Mike"], [94, 176, "apple", "silver", "Miller"], [95, 176, "banana", "gold", "John"], [96, 176, "orange", "purple", "Mike"], [445, 111, "apple", "silver", "Miller"], [100, 112, "cherry", "bronze", "Gus"], [232, 111, "apple", "silver", "Miller"], [355, 555, "cherry", "bronze", "Gus"] ], columns=["unique_id", "person_id", "fruit_name", "poduct", "guest"] )
核心处理逻辑:
# 为每个person_id组内的行生成顺序序号,从0开始 df["group_order"] = df.groupby("person_id").cumcount() # 按person_id分组、组内序号做透视,将纵向行转为横向列 pivot_table = df.pivot( index="person_id", columns="group_order", values=["unique_id", "fruit_name", "poduct", "guest"] ) # 按示例规则生成列名 pivot_table.columns = [ f"unique_id_{order}" if field == "unique_id" and order != 0 else field for field, order in pivot_table.columns ] # 还原行顺序:匹配原始表中各person_id首次出现的先后位置 first_appear_order = df[df["group_order"] == 0].reset_index() final_result = pivot_table.reset_index().merge( first_appear_order[["person_id", "index"]], on="person_id", how="right" ).sort_values(by="index").drop(columns="index").reset_index(drop=True)
运行代码后得到的final_result结构完全匹配你给出的输出示例:仅单次出现的person_id行右侧无拓展列,多次重复的person_id会按组内原始顺序,把后续行的内容依次拼接到右侧对应位置。
可参考的搜索关键词
如果需要进一步拓展功能,可以用以下关键词检索相关实现方案:
pandas 分组横向展开重复记录pandas pivot 同组行转列pandas 聚合多记录为单行多列
注:内容的提问来源于stack exchange,提问作者ApacheOne
相关产品推荐
相关产品推荐

