You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

保留重复值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:10:48