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

删除含NaN的列后,MultiIndex的columns.levels仍显示已删列,求原因

为什么删除含NaN的MultiIndex列后,df.columns.levels仍保留已删除的列名?

核心原因:MultiIndex的levels + codes存储机制

Pandas的MultiIndex采用两层存储结构:

  • levels:存储该层级所有曾出现过的标签全集,一旦MultiIndex创建完成,这个集合默认不会自动更新
  • codes:存储每个索引位置对应的levels下标,删除列时仅修改codes(移除对应下标的条目),不会改动levels本身

在你的案例中:

  1. 初始创建的MultiIndex level1的levels是['aa', 'bb', 'cc', 'dd']
  2. 删除含NaN的('B','cc')列时,Pandas只是从codes中去掉了对应'cc'的下标,但levels依然保留原始的完整标签集合
  3. 因此调用mydf.columns.levels[1]时,仍会返回包含已删除标签'cc'的原始全集

为什么要这么设计?

这是Pandas为性能优化做出的选择:如果每次增删索引标签都重构levels,会带来额外的计算开销,尤其是在频繁操作索引的场景下。保留原始levels可以避免不必要的集合运算,提升处理效率。

补充:获取当前存在的层级标签

如果你需要获取当前DataFrame中实际存在的level1标签,可以用:

# 获取当前存在的level1标签(去重)
mydf.columns.get_level_values(1).unique()

# 或者主动重构索引,更新levels
mydf.columns = mydf.columns.remove_unused_levels()
mydf.columns.levels[1]  # 此时会返回['aa', 'bb', 'dd']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:35:37