如何在Pandas concat时正确处理多索引列名顺序问题
合并索引列顺序不同的多索引DataFrame时如何正确识别索引列名?
问题复现
你有两个以id_a、id_b为索引的DataFrame,但索引列顺序不同:
import pandas as pd foo = pd.DataFrame([{'id_a': 1, 'id_b': 1, 'value': 1}]) foo.set_index(['id_a','id_b'], inplace=True) bba = pd.DataFrame([{'id_b': 2, 'id_a': 1, 'value': 10}]) bba.set_index(['id_b', 'id_a'], inplace=True)
直接执行pd.concat([foo, bba])会出现索引混淆:id_a被错误赋值为2(实际是id_b的值),而非预期的空值——这是因为concat默认按索引层级的位置而非名称对齐。
解决方案
核心是统一两个DataFrame的索引层级顺序,让concat能按索引名称正确匹配。可以用reorder_levels()调整其中一个的索引层级:
# 调整bba的索引层级,与foo的顺序保持一致(id_a在前,id_b在后) bba_aligned = bba.reorder_levels(['id_a', 'id_b']) # 执行合并 qux = pd.concat([foo, bba_aligned])
合并后的结果会正确识别索引列名:
| id_a | id_b | value |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 2 | 10 |
原理说明
pandas的concat()处理MultiIndex时,默认按层级的位置(第0层、第1层)来对齐,完全忽略层级名称。当两个DataFrame的索引层级顺序不同时,比如一个是[id_a, id_b],另一个是[id_b, id_a],concat会把第一个的第0层和第二个的第0层视为同一列,直接导致值与名称不匹配的问题。
用reorder_levels()可以在保留索引值与对应名称关联的前提下,调整层级顺序,让两个DataFrame的索引结构完全一致,此时concat就能按名称正确合并。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

