Pandas执行pivot时报错Index contains duplicate entries无法重塑如何解决
报错根因
调用pivot()方法抛出该错误的核心原因是*protocol_no与activity的组合存在重复条目*:
- 协议号
1586212下存在2条activity=drive的记录 - 协议号
2547852下存在2条activity=eat的记录pivot()要求每一组「行索引+列索引」的组合唯一,否则无法确定单元格对应的取值,因此触发报错,该报错与字段是字符串或数值类型无关。
解决方案
你给出的预期输出是保留重复组合的第一条description,可以用以下两种方式实现:
方案1:使用pivot_table()(推荐,适配重复值场景)
pivot_table()支持自定义聚合规则处理重复值,指定aggfunc='first'即可保留每个组合的第一条记录:
# 生成宽表 result = df.pivot_table( index="protocol_no", columns="activity", values="description", aggfunc="first" ).reset_index()
如果需要将同一个组合的多个描述拼接起来,可以修改聚合规则:
# 多个描述用顿号拼接 result = df.pivot_table( index="protocol_no", columns="activity", values="description", aggfunc=lambda x: "、".join(x.dropna()) ).reset_index()
方案2:先去重再调用pivot()
先对重复的protocol_no+activity组合去重,再执行原有pivot逻辑:
# 去重,保留每组第一条记录 df_dedup = df.drop_duplicates(subset=["protocol_no", "activity"], keep="first") # 执行pivot转换 result = df_dedup.pivot(index="protocol_no", columns="activity", values="description").reset_index()
两种方案均可以得到你给出的预期输出结构。
内容的提问来源于stack exchange,提问作者Guilherme Noronha
相关产品推荐
相关产品推荐

