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

如何从Pandas三级多级索引DataFrame中选择指定前两级索引组合的子集

如何从Pandas三级多级索引DataFrame中选择指定前两级索引组合的子集

嘿,这个多级索引的筛选需求很典型,我来给你分享几个实用的解决办法,保证能轻松得到你想要的子集!

首先先确认下你的原始数据构造(就是你给出的这段代码):

import pandas as pd
import numpy as np

# Sample data
index = pd.MultiIndex.from_tuples([
    ('A', 'a1', 'x'),
    ('A', 'a1', 'y'),
    ('A', 'a2', 'x'),
    ('A', 'a2', 'y'),
    ('B', 'b1', 'x'),
    ('B', 'b1', 'y'),
    ('B', 'b2', 'x'),
    ('B', 'b2', 'y')
], names=['level_1', 'level_2', 'level_3'])

data = np.random.randn(len(index))
df = pd.DataFrame(data, index=index, columns=['value'])

接下来先定义你要筛选的前两级索引组合:

S = [('A', 'a1'), ('B', 'b2')]

方法一:使用.loc + 元组列表(最直观)

Pandas的.loc支持直接传入前两级索引的元组列表,第三级用:表示保留所有项,写法非常简洁:

subset_df = df.loc[S, :]

这样就能直接得到你想要的结果,完美匹配你给出的子集示例!

方法二:使用isin配合索引层级提取

如果你想更灵活地控制筛选逻辑,可以先提取前两级索引的组合,再用isin判断:

# 提取前两级索引的元组序列
level1_2 = df.index.get_level_values(['level_1', 'level_2'])
# 筛选符合条件的行
subset_df = df[level1_2.isin(S)]

这种方法在需要添加额外筛选条件时会更方便。

方法三:使用pd.IndexSlice(适合更复杂的索引场景)

如果你的索引筛选逻辑更复杂(比如需要范围筛选),可以用pd.IndexSlice来明确指定层级:

idx = pd.IndexSlice
# 前两级匹配S中的组合,第三级全部保留
subset_df = df.loc[idx[S, :], :]

这种写法可读性很强,尤其当索引层级更多时,能清晰区分每一层的筛选规则。

不管用哪种方法,最终得到的结果都会和你预期的一致:

value
level_1 level_2 level_3       
A       a1      x     0.123456
                y     0.234567
B       b2      x     0.789012
                y     0.890123

备注:内容来源于stack exchange,提问作者TTY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:38:00