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

如何用含DataFrame层级子集的(多)索引对MultiIndex DataFrame索引?

用MultiIndex子集筛选DataFrame(保留其他层级所有行)

假设你有一个带MultiIndex的DataFrame,想要用一个仅包含原索引部分层级的子集来筛选数据,同时让未被筛选的层级保留所有行——这正是你示例里的需求,对吧?下面就一步步来实现:

1. 先还原你的示例数据

首先我们先构建出你给出的示例DataFrame:

import pandas as pd

# 构造MultiIndex
arrays = [[1, 1, 1, 2, 2, 2], ['a', 'b', 'c', 'a', 'b', 'c']]
multi_index = pd.MultiIndex.from_arrays(arrays, names=['num', 'chr'])

# 创建DataFrame
df = pd.DataFrame(
    {'col': [0.845402, 0.099432, 0.507409, 0.684363, 0.582436, 0.666528]},
    index=multi_index
)

2. 获取目标子集索引

按照你的需求,先计算每个chr的均值,再取最小的2个chr作为筛选子集:

# 计算各chr的均值并取最小的2个的索引
target_chrs = df['col'].unstack('chr').mean().nsmallest(2).index

3. 筛选DataFrame(保留其他层级所有行)

这里的核心是用slice(None)表示“保留该层级所有行”,然后结合df.loc来定位:

# 筛选:num层级保留所有,chr层级只取target_chrs中的值
filtered_df = df.loc[(slice(None), target_chrs), :]
print(filtered_df)

输出结果会是:

col
num chr     
1   b   0.099432
    c   0.507409
2   b   0.582436
    c   0.666528

通用场景扩展

如果你的MultiIndex有更多层级(比如['num', 'chr', 'site']),想要筛选chr的子集同时保留num和site的所有行,只需要在索引元组对应位置用slice(None)即可:

# 假设新增site层级后的筛选
filtered_df = df.loc[(slice(None), target_chrs, slice(None)), :]

这个方法的好处是直接基于MultiIndex操作,不需要重置索引再还原,效率和可读性都很高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:14