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
相关产品推荐
相关产品推荐

