You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas合并部分列匹配的DataFrame如何让非匹配列值留空?

方法选择结论

你当前的需求是纵向拼接行、自动对齐列,既不适合用默认的join(),也不适合用关联逻辑的merge(),直接使用pandas的pd.concat()即可完全实现预期效果。

原代码问题排查
  • 逻辑误用:merge()的核心逻辑是按指定公共列横向匹配关联行,把两个表的列拼到同一行,并非把两个表的行上下堆叠。两个表的非公共尺码列会被识别为独立字段,若存在同名字段pandas会自动添加_x/_y后缀区分左右表来源,这就是你看到带后缀重复列的根本原因。
  • 异常列来源:Unnamed开头的列和合并操作无关,是读取xlsx时pandas对无表头空列的自动命名,属于读入环节的脏数据。
修正实现代码
  1. 先清理读入时产生的空列
# 移除两个表中所有Unnamed开头的空列
table1 = table1.loc[:, ~table1.columns.str.startswith('Unnamed')]
table2 = table2.loc[:, ~table2.columns.str.startswith('Unnamed')]
  1. 纵向拼接自动对齐列
# 按行拼接,自动对齐列名,重置行号
merged_data = pd.concat([table1, table2], axis=0, ignore_index=True)

参数说明:

  • axis=0:指定按行方向纵向堆叠两个表的数据
  • ignore_index=True:拼接后重置连续行索引,满足行号按顺序重排的要求

拼接时pandas会自动对齐所有列名:两个表共有的列会自动按字段名匹配填充,单个表独有的列,另一表对应的行位置会自动留空,完全符合你的预期:Table1的鞋品行XS/S/M/L/XL列留空,Table2的外套行ONE SIZE/34/36/38/40列留空。

补充说明:merge()和join()均为横向关联场景设计,适用于「按公共字段把两个表的列拼到同一行」的需求(比如按货号把商品价格表的价格列匹配到库存表中),不适用于当前纵向拼表的场景。

内容的提问来源于stack exchange,提问作者PythonLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:09:21