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

如何使用基于整数位置的索引访问MultiIndex DataFrame第一层级对应行

问题描述

假设我有如下名为df的MultiIndex Series:

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"],]
tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])

df = pd.Series(np.random.randn(8), index=index)

我可以用df.xs(('baz'))获取baz关联的所有行,现在我希望像单索引DataFrame的iloc用法一样,通过第一层级的整数位置访问对应分组:期望位置0、1、2、3分别对应bar、baz、foo、qux。
之前尝试用df.loc[[df.index.get_level_values(0)[1]]],但返回的是bar的分组行,原因是索引的位置1仍属于bar分组,需要传入2才能拿到baz的行,有没有方法可以直接按第一层级的整数序号获取对应分组的所有行?


解决方案

你可以先提取第一层级索引去重后的有序值,再按序号取值查询,这个方案性能最好也最常用:

方法1:搭配unique()和xs

# 先拿到第一层级去重后的所有标签,顺序就是bar、baz、foo、qux
level0_labels = df.index.get_level_values('first').unique()
# 传入你要的序号i即可,比如i=1对应baz
i = 1
result = df.xs(level0_labels[i], level='first')

运行后得到的就是baz对应的所有行,和df.xs('baz')结果完全一致。

方法2:通过groupby取对应序号分组(适合小数据量场景)

如果数据量不大,也可以直接对第一层级分组后取第i个分组:

i = 1
result = list(df.groupby(level='first'))[i][1]

原代码问题说明

你之前的写法df.index.get_level_values(0)[1]是取整个MultiIndex的第1行对应的第一层级值,你的原索引前两行都属于bar分组,所以取到的值是bar,自然返回bar的分组内容,和你要的「第一层级的第1个分组」逻辑不符,只要先对第一层级去重就能拿到按分组排序的标签列表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:05