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

如何在MultiIndex DataFrame中根据上层索引值获取下层索引的所有可能值

获取MultiIndex中指定0级索引对应的上层级所有取值

嘿,这个需求在处理多层索引DataFrame时特别常见,我来给你几个简单高效的解决方案,先从补全你的示例代码开始:

先构建完整的MultiIndex DataFrame

import pandas as pd
import numpy as np

arrays = [
    ['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
    ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'],
    ['a','b','a','b','b','b','b','b']
]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])

方法1:用xs切片后提取层级值

xs方法可以快速按层级索引切片,之后直接提取对应层级的唯一值就行,非常直观:

# 筛选0级索引为'bar'的子数据集
bar_subset = df.xs('bar', level='first')

# 获取1级(second)的所有唯一取值
second_unique = bar_subset.index.get_level_values('second').unique()
# 获取2级(third)的所有唯一取值
third_unique = bar_subset.index.get_level_values('third').unique()

print("1级索引的所有取值:", second_unique)
print("2级索引的所有取值:", third_unique)

方法2:直接用索引掩码(高效适合大数据集)

如果你的DataFrame数据量很大,直接操作索引掩码会更高效,避免生成子DataFrame:

# 生成0级索引等于'bar'的布尔掩码
bar_mask = df.index.get_level_values('first') == 'bar'

# 提取对应掩码位置的上层级索引并去重
second_unique = df.index.get_level_values('second')[bar_mask].unique()
third_unique = df.index.get_level_values('third')[bar_mask].unique()

方法3:获取上层级的组合取值

如果你需要的是上层级的组合值(比如('one','a')这种元组形式),可以直接对筛选后的索引取唯一值:

bar_level_combinations = df.index[bar_mask].unique()
print("所有上层级的组合取值:", bar_level_combinations)

小提示

  • 如果你的层级是按位置而不是名称定义的,把level='first'换成level=0就行,同理level='second'换成level=1;
  • unique()方法会保留取值的出现顺序,如果你需要排序,可以再加个.sort_values()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:32:27