为何pandas的merge在多索引连接时丢失l0层级,而join不会?
问题解释:merge与join处理MultiIndex的差异
核心原因:两者的设计逻辑本质不同
merge和join的底层行为逻辑存在明显区别,这直接导致了它们处理MultiIndex时出现索引层级的差异:
1. merge的行为:索引会被转为普通列
merge的默认逻辑是基于列完成合并,无论你指定的合并键是原DataFrame的列还是索引层级:
- 执行
t.merge(t2, how='left', on='l1')时,pandas会先把t的整个MultiIndex(l0和l1)全部转成普通列,同时也会将t2的索引l1转为列; - 之后以
l1列为键完成左连接,最终结果的索引会被重置为默认的整数序列,原来的l0变成了普通列(并非真的“丢失”,只是不再作为索引层级存在)。
2. join的行为:完整保留原索引结构
join是专门为基于索引的合并设计的,默认会保留左表的索引结构:
- 执行
t.join(t2, how='left', on='l1', lsuffix='_x', rsuffix='_y')时,on='l1'表示用t的l1索引层级去匹配t2的l1索引; - 整个过程中
t的原MultiIndex(l0和l1)会被完整保留,不会转为普通列,所以l0依然是索引的第0层。
让merge保留原索引的方法
如果想让merge也保留l0作为索引,可以手动指定用索引参与合并,示例代码如下:
# 用左表的l1索引层匹配右表的l1索引,之后重新设置索引 t.merge(t2, how='left', left_on='l1', right_index=True).set_index(['l0', 'l1'])
这样得到的结果索引结构就和join的一致了。
内容的提问来源于stack exchange,提问作者guyguyguy12345
相关产品推荐
相关产品推荐

