合并不同列数Pandas DataFrame时报错Plan shapes are not aligned如何解决
问题原因
你遇到的ValueError: Plan shapes are not aligned报错,核心是两个DataFrame做轴向拼接时结构无法对齐,常见触发原因有三个:
- 代码中变量名错误,你示例拼接代码写的是
[df, df2],若你的第一个表实际变量名是df1就会触发错误 - 两个DataFrame的列结构存在隐藏不一致(比如某张表有多级列索引、重复列名,或者你示例中df1的最后一行多出来一个值,实际可能存在列数和列名不匹配的问题)
- 低版本pandas对列数不一致的表纵向拼接的兼容性不足
解决方案
方案1:补全列结构后拼接(最稳妥)
先把少列的df2按照df1的列结构补全,缺失列自动填充NaN后再拼接,完全避免对齐问题:
# 给df2补全和df1完全一致的列结构 df2_extend = df2.reindex(columns=df1.columns) # 纵向拼接 df3 = pd.concat([df1, df2_extend], axis=0, ignore_index=True)
方案2:先校验结构再操作
如果执行方案1仍报错,先运行以下代码确认两张表的实际结构是否符合预期,排除列数/列索引异常:
# 输出df1的列名、行列数 print("df1列名:", df1.columns.tolist()) print("df1行列数:", df1.shape) # 输出df2的列名、行列数 print("df2列名:", df2.columns.tolist()) print("df2行列数:", df2.shape)
如果输出发现存在列名重复、多级索引、列数和预期不符的情况,先修正表结构再执行拼接即可。
方案3:强制数组拼接(极端场景备用)
如果仅需要数据合并不需要保留原有索引逻辑,可转成numpy数组强制拼接后再转回DataFrame:
import numpy as np # 拼接数组后转DataFrame,沿用df1的列名 df3 = pd.DataFrame( np.vstack([df1.values, df2.reindex(columns=df1.columns).values]), columns=df1.columns )
内容的提问来源于stack exchange,提问作者spcol
相关产品推荐
相关产品推荐

