使用assign时报ValueError: cannot reindex on an axis with duplicate labels的原因
解决
ValueError: cannot reindex on an axis with duplicate labels错误 问题场景
你尝试执行以下代码,以_(含前后可选空白)为分隔符拆分engine_type列的值:
df = pd.read_csv("/content/sample_data/used_cars.csv") dds = df.assign(engines_type= lambda x: x['engine_type'].str.split(r'\s*_\s*').explode()).reset_index()
运行时触发错误:
ValueError: cannot reindex on an axis with duplicate labels
错误原因
- 核心问题是原DataFrame(
df)的索引存在重复值。explode()操作会让拆分后的每一行继承原行的索引,导致新生成的中间DataFrame索引出现大量重复项。 - 后续调用的
reset_index()默认会保留原索引作为新列(列名为index),同时尝试创建新的连续整数索引。但pandas内部的重新索引逻辑要求操作对象的索引唯一,因此触发该报错。
解决方法
方法1:重置索引时丢弃原重复索引
在reset_index()中添加drop=True参数,直接生成新的唯一整数索引,不再保留原重复索引:
dds = df.assign(engines_type=lambda x: x['engine_type'].str.split(r'\s*_\s*').explode()).reset_index(drop=True)
方法2:先重置原DataFrame的索引
先将原数据的索引转为唯一整数索引,再执行拆分操作,从根源避免重复索引问题:
df = pd.read_csv("/content/sample_data/used_cars.csv").reset_index(drop=True) dds = df.assign(engines_type=lambda x: x['engine_type'].str.split(r'\s*_\s*').explode()).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者logeeks
相关产品推荐
相关产品推荐

