如何在不聚合的情况下对含重复索引的长格式DataFrame进行Pivot操作
解决Pandas长表转宽表保留重复行的问题
你遇到的重复索引错误,核心原因是pivot/pivot_table要求用作行索引的列组合必须唯一,但你的数据中同一Run ID+Accession ID+Analyte存在多条检测记录,导致索引重复。要保留所有重复行,只需先给每组重复行添加唯一序号,再执行转宽操作:
步骤1:添加分组内序号列
先确定需要保留的行标识列(比如Run ID、Accession ID,以及其他不需要转成列的字段),给每组重复行生成一个递增序号,确保索引唯一:
# 替换为你实际需要保留的行标识列 group_cols = ['Run ID', 'Accession ID', 'Sample Date', '其他需要保留的列'] df['seq'] = df.groupby(group_cols).cumcount()
步骤2:执行转宽操作
用pivot将Analyte转为列,此时包含seq的索引组合已经唯一,不会触发重复索引错误:
wide_df = df.pivot( index=group_cols + ['seq'], columns='Analyte', values='Concentration' ).reset_index()
步骤3:清理结果(可选)
如果不需要seq列区分重复行,可以直接删除;如果需要保留用来标记同一标识下的多次检测,也可以保留:
# 删除seq列 wide_df = wide_df.drop(columns='seq')
这样得到的宽表会完整保留所有重复的检测记录,每个Run ID+Accession ID下的多次检测值会以独立行的形式存在,对应Analyte列会填充各自的Concentration值,无值的位置会显示NaN。
内容的提问来源于stack exchange,提问作者Gingerhaze
相关产品推荐
相关产品推荐

