Pandas中pd.concat合并DataFrames失败的原因及解决方法
Pandas合并DataFrame报错:Shape of passed values与indices不匹配的原因及解决办法
原因分析
这个报错的核心是DataFrame的索引元数据存在异常,并非数据本身的行列结构问题:
- 使用
inplace=True重置索引时,可能因原DataFrame是视图而非副本,导致索引修改未真正生效,残留了异常的索引结构; - 原DataFrame的索引可能存在隐藏的重复值或损坏,使得
pd.concat计算预期行数时出现偏差; - 从
to_dict()重建后能正常合并,也验证了问题出在DataFrame的元数据(而非数据内容)上。
解决方法
1. 替换inplace=True为赋值式重置索引
避免inplace操作带来的视图/副本问题,改用链式调用赋值:
df1 = all_predictions[1].head(3).reset_index(drop=True)[["key_id", "prediction", "yrmon"]] df2 = all_predictions[2].head(3).reset_index(drop=True)[["key_id", "prediction", "yrmon"]]
2. 强制重建DataFrame清除异常元数据
直接用pd.DataFrame重新构造,彻底重置所有元数据:
# 方式一:基于原数据重建 df1 = pd.DataFrame(all_predictions[1].head(3), columns=["key_id", "prediction", "yrmon"]).reset_index(drop=True) df2 = pd.DataFrame(all_predictions[2].head(3), columns=["key_id", "prediction", "yrmon"]).reset_index(drop=True) # 方式二:用to_dict重建(已验证有效) df1 = pd.DataFrame(all_predictions[1].head(3).to_dict("records"))[["key_id", "prediction", "yrmon"]] df2 = pd.DataFrame(all_predictions[2].head(3).to_dict("records"))[["key_id", "prediction", "yrmon"]]
3. 检查并修复原索引异常
先排查索引是否有重复或损坏:
# 检查索引是否有重复 print(all_predictions[1].index.has_duplicates) print(all_predictions[2].index.has_duplicates) # 若有重复,先重置索引再处理 df1 = all_predictions[1].reset_index(drop=True).head(3)[["key_id", "prediction", "yrmon"]] df2 = all_predictions[2].reset_index(drop=True).head(3)[["key_id", "prediction", "yrmon"]]
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

