如何按层级提取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
相关产品推荐
相关产品推荐

