如何使用基于整数位置的索引访问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
相关产品推荐
相关产品推荐

