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

如何按层级提取Pandas MultiIndex所有值?是否有更简便方法?

问题:提取Pandas MultiIndex各层级的所有值

现有Pandas MultiIndex实例:

idx = pd.MultiIndex.from_product([['A', 'B'], ['C', 'D']])

其结构为:

MultiIndex([('A', 'C'),
            ('A', 'D'),
            ('B', 'C'),
            ('B', 'D')],
           )

期望按层级提取所有值,格式为[level0值列表, level1值列表],对应示例的期望输出为:

[['A', 'A', 'B', 'B'], ['C', 'D', 'C', 'D']]

我已尝试两种方法:

方法1

>>> idx.to_frame().T.values.tolist()

[['A', 'A', 'B', 'B'], ['C', 'D', 'C', 'D']]

方法2

>>> [idx.get_level_values(i) for i in range(len(idx[0]))]

[Index(['A', 'A', 'B', 'B'], dtype='object'),
 Index(['C', 'D', 'C', 'D'], dtype='object')]

两种方法均符合需求,但想了解是否有专门的内置函数或更简便的实现方式?


解答

最优简便实现

Pandas没有专门对应这个需求的单一内置函数,但可以基于get_level_values写出更简洁高效的代码:

# 按层级名称遍历(可读性更强)
[idx.get_level_values(level).tolist() for level in idx.names]

# 或按层级数量遍历(写法更简洁)
[idx.get_level_values(i).tolist() for i in range(idx.nlevels)]

这两种写法都能直接输出你需要的[['A', 'A', 'B', 'B'], ['C', 'D', 'C', 'D']]格式。

方法对比

  • 你使用的方法1(idx.to_frame().T.values.tolist())虽然可行,但会额外生成DataFrame,当MultiIndex规模较大时,性能不如直接操作MultiIndex本身。
  • 方法2的思路已经很合理,只需给每个Index结果加上.tolist(),就能直接得到纯列表,无需后续转换。

另外还有一种基于.levels和.codes的写法,但逻辑繁琐,不推荐:

[[idx.levels[i][code] for code in idx.codes[i]] for i in range(idx.nlevels)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:22:22