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

pandas.merge()输出列规则疑问及代码异常现象求解

Pandas 1.5.2 merge() 输出异常与列规则详解

一、你的问题解析

1. 为什么列"A"是Series的索引,且未保留原索引?

  • 合并键命名规则:你使用left_index=True(左表用索引作合并键)和right_on="A"(右表用列"A"作合并键),此时pandas会将左表的索引作为合并键,并沿用右表键列的名称"A",所以结果中第一列"A"的值是s1的索引(4/5/6)。
  • 同名列后缀处理:你的左表是name="A"的Series,转成DataFrame后自带一列"A";右表也有一列"A"。这两列都不是合并键(合并键是左索引和右表的"A"列),因此pandas根据suffixes参数给它们加上后缀,得到"A_left"(左表原列值100/200/300)和"A_right"(右表原列,因无匹配值显示NaN)。
  • 索引丢失原因:merge默认会丢弃原索引,生成新的RangeIndex(你输出中的NaN是显示误差,实际为0/1/2这类连续索引)。若要保留原索引,需手动通过set_index调整,或改用join方法。
  • 无匹配的原因:左表索引是4/5/6,右表列"A"的值是100/200/300,两者完全不匹配,因此左连接后右表的B/C/D列全部显示NaN。

2. merge() 输出列的详细规则

(1)合并键列的处理

  • 若合并键来自列(left_on/right_on):
    • 左右键列同名时,结果保留一个键列,名称为原列名(不加后缀)。
    • 左右键列不同名时,结果保留两个键列,分别使用原列名。
  • 若合并键来自索引(left_index/right_index):
    • left_index=True + right_on=col:键列名称取right_on指定的列名,值为左表索引。
    • right_index=True + left_on=col:键列名称取left_on指定的列名,值为右表索引。
    • left_index=True + right_index=True:键列名称优先取左表索引名(若存在),否则取右表索引名,均无则默认命名为"index"。

(2)非键列的处理

  • 非键列同名时:根据suffixes参数(默认('_x', '_y'))给左表列加第一个后缀,右表列加第二个后缀。
  • 非键列不同名时:直接保留原列名,按左表→右表的顺序排列。

(3)列的顺序

  • 合并键列排在最前面。
  • 随后是左表的非键列(按原顺序)。
  • 最后是右表的非键列(按原顺序)。

(4)索引的处理

  • merge默认生成新的RangeIndex(连续整数),丢弃原索引。
  • 如需保留原索引,合并后可调用df.set_index(原索引列名),或改用join方法(默认保留左表索引)。

二、修正示例(实现正确匹配)

若你想让左表的Series值与右表的"A"列匹配,应将合并键改为左表的列"A",而非索引:

df3 = pd.merge(
    s1,
    df2,
    suffixes=("_left", "_right"),
    how="left",
    left_on="A",  # 使用左表的列"A"作为合并键
    right_on="A",
)
print(df3)

输出结果:

A  B  C  D
0  100  1  1  1
1  200  2  2  2
2  300  3  3  3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:40:41