Pandas新增列时报ValueError: cannot reindex from a duplicate axis问题求助
报错原因
- 该报错的核心诱因是你的
comp_dataDataFrame存在重复索引值:- 你单独筛选计算得到的Series,是基于原DataFrame的索引返回结果的。当你尝试将这个Series赋值回原DataFrame作为新列时,Pandas需要根据索引完成行列对齐匹配
- 只要原DataFrame的索引存在重复值,Pandas就无法确定重复索引对应的行要如何匹配赋值,因此触发
ValueError: cannot reindex from a duplicate axis错误 - 你可以运行
print(comp_data.index.has_duplicates)验证,返回结果必然为True
解决方法
以下两种常用方案均可解决该问题:
方案1:整列条件赋值(最推荐)
直接通过where方法按条件对全列做赋值,无需先筛选子Series,完全避开索引对齐问题,不满足条件的行自动填充为NaN,和你预期的效果完全一致:
rep_date = pd.to_datetime('2021-08-31') comp_data['Aug-2021 DPO'] = (comp_data['Due Dt'] - rep_date).dt.days.where( (comp_data['Inv Dt'] <= rep_date) & (comp_data['Due Dt'] > rep_date) )
方案2:重置索引后操作
如果你需要保留原有筛选逻辑,可以先将DataFrame重置为唯一的连续索引,完成赋值后再恢复原有索引:
# 保存原索引 origin_index = comp_data.index # 重置为无重复的默认索引 comp_data = comp_data.reset_index(drop=True) rep_date = pd.to_datetime('2021-08-31') # 执行赋值操作,此时索引无重复不会报错 comp_data['Aug-2021 DPO'] = (comp_data.loc[(comp_data['Inv Dt'] <= rep_date) & (comp_data['Due Dt'] > rep_date), 'Due Dt'] - rep_date).dt.days # 恢复原索引 comp_data.index = origin_index
内容的提问来源于stack exchange,提问作者Shi Junyi
相关产品推荐
相关产品推荐

