如何为Pandas中带MultiIndex列索引的DataFrame新增顶层列索引
错误原因
使用pd.MultiIndex.from_product时若传入已有的MultiIndex对象作为参数,会触发NotImplementedError: isna is not defined for MultiIndex报错。原因是该方法仅支持传入单层可迭代序列用于生成笛卡尔积,处理MultiIndex类型的元素时,内部的空值检查逻辑未实现。
修复方案
方案1:直接拼接索引元组(推荐)
遍历现有列的每个MultiIndex元组,在最前面插入顶层索引值,再通过from_tuples生成新的多层索引:
import pandas as pd df = pd.DataFrame({'A': [11, 21, 31], 'B': [12, 22, 32], 'C': [13, 23, 33]}, index=['ONE', 'TWO', 'THREE']) # 原有生成两层列索引的代码不变 df.columns = pd.MultiIndex.from_product([['level1'],['level2'],df.columns ]) # 替换原报错代码,新增顶层Top索引 df.columns = pd.MultiIndex.from_tuples([('Top', *col) for col in df.columns]) # 打印验证输出 print(df)
运行后输出完全符合预期效果:
Top level1 level2 A B C ONE 11 12 13 TWO 21 22 23 THREE 31 32 33
方案2:concat快速添加顶层索引
通过列方向concat的keys参数自动生成顶层索引,代码更简洁:
# 原有生成两层列索引的代码不变 df.columns = pd.MultiIndex.from_product([['level1'],['level2'],df.columns ]) # 列方向拼接单个DataFrame,keys参数指定顶层索引值 df = pd.concat([df], keys=['Top'], axis=1)
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

