Pandas多字段透视含重复值DataFrame报错解决
解决DataFrame透视时重复值引发的ValueError问题
问题说明
现有一个DataFrame需要转换为指定格式,但因存在重复条目,调用pivot()时触发错误:ValueError: Index contains duplicate entries, cannot reshape。
示例数据
原始DataFrame的生成代码:
import pandas as pd dummy_data = { 'Field_Names': ['Field_1','Field_2','Field_3','Field_1','Field_2','Field_3'], 'Field_Values': ['Bob','STL','1234','Eric','DSM','5678'], 'Record_ID': ['abc123','abc123','abc123','abc123','abc123','abc123'] } dummy_df = pd.DataFrame(dummy_data) display(dummy_df)
期望输出
目标格式的DataFrame生成代码:
details = {'Field_1': ['Bob', 'Eric'], 'Field_2': ['STL', 'DSM'], 'Field_3': ['1234', '5678'], 'Field_ID': ['abc123','abc123']} desired_output = pd.DataFrame(details) display(desired_output)
尝试过的无效方法
- 分组后转列表的方式未得到预期结构:
final_df = dummy_df.groupby('Field_Names')['Field_Values','Record_Id'].apply(list) final_df = pd.DataFrame({i:final_df.loc[i] for i in final_df.index.to_list()})
- 直接调用
pivot()触发重复值错误:
dummy_df.pivot(index='Record_ID', columns='Field_Names', values='Field_Values').reset_index()
解决方案
问题根源在于pivot()要求index + columns的组合必须唯一,原始数据中同一个Record_ID对应多组相同的Field_Names,导致组合重复。解决方法是给每组重复条目添加一个组内序号,确保组合唯一:
步骤1:添加组内序号
# 给Record_ID+Field_Names的每组重复条目添加行号 dummy_df['row_num'] = dummy_df.groupby(['Record_ID', 'Field_Names']).cumcount()
步骤2:执行透视并整理结构
# 以Record_ID+row_num作为索引进行透视 final_df = dummy_df.pivot( index=['Record_ID', 'row_num'], columns='Field_Names', values='Field_Values' ).reset_index() # 重命名列并移除临时行号列 final_df = final_df.rename(columns={'Record_ID': 'Field_ID'}).drop('row_num', axis=1) display(final_df)
执行后即可得到与期望输出一致的结果。
内容的提问来源于stack exchange,提问作者Carson Whitley
相关产品推荐
相关产品推荐

