保留重复值的DataFrame pivot转换问题求助
保留重复行的CSV宽表转换方案
你的问题核心是:pivot要求index+columns的组合必须唯一,而数据中同一id对应多个相同code的行(如314asre有两条B1记录),导致冲突报错;pivot_table默认会对重复的index+columns组合做聚合,从而合并了重复行,不符合需求。
解决方案
通过添加分组内的唯一序号作为辅助索引,满足pivot的唯一性要求,最终保留所有原始行:
步骤1:构造示例数据(或加载你的CSV)
import pandas as pd # 加载本地CSV用:df = pd.read_csv('your_file.csv') data = { 'id': ['314asre', '343asr', '150ase', '314asre', '343asr'], 'code': ['B1', 'B2', 'B1', 'B1', 'B3'], 'date': ['20201010', '20200405', '20210615', '20210506', '20220408'] } df = pd.DataFrame(data)
步骤2:添加辅助序号并执行透视
# 给每个id分组内的行编号,确保索引唯一 df['seq'] = df.groupby('id').cumcount() # 执行透视,用id+seq作为唯一索引 pivoted_df = df.pivot(index=['id', 'seq'], columns='code', values='date') # 清理辅助列,替换缺失值为NULL pivoted_df = pivoted_df.reset_index(level='seq', drop=True).reset_index() pivoted_df = pivoted_df.fillna('NULL') # 调整列顺序(可选,与目标格式对齐) pivoted_df = pivoted_df[['id', 'B1', 'B2', 'B3']]
输出结果
id B1 B2 B3 0 314asre 20201010 NULL NULL 1 314asre 20210506 NULL NULL 2 343asr NULL 20200405 NULL 3 343asr NULL NULL 20220408 4 150ase 20210615 NULL NULL
关键说明
groupby('id').cumcount():为每个id下的重复行生成递增序号,让(id, seq)成为唯一组合,解决pivot的重复索引报错问题。- 透视后删除辅助序号列,完全保留原始行的结构,避免
pivot_table的聚合合并行为。
内容的提问来源于stack exchange,提问作者Sukrut Shishupal
相关产品推荐
相关产品推荐

