如何用含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
相关产品推荐
相关产品推荐

