仅使用.loc[]如何从多级索引DataFrame中提取单个索引列?
用.loc[]从多级索引DataFrame提取单个索引列
问题描述
手上有个多级索引DataFrame test2(构造代码见下方),想只用.loc[]提取其中的age索引列,已经知道.query()、.get_level_values()这些替代方法,但想搞明白.loc[]的通用操作逻辑,求解释。
构造代码:
import pandas as pd test = pd.DataFrame({ 'credit_score': [608, 607, 502, 699, 850], 'age': [42, 41, 42, 39, 43], 'exited': ['Yes', 'No', 'Yes', 'No', 'No'], 'surname': ['Hargrave', 'Hill', 'Hill', 'Boni', 'Mitchell'], 'geography': ['France', 'Spain', 'France', 'France', 'Spain'] }) test2 = test.set_index(['credit_score', 'age'])
解决方案
首先明确:.loc[]本身是用来选取行/列数据的,而索引列属于DataFrame的index对象,并非普通数据列。所以要提取age索引,得先通过.loc选中目标范围,再从索引对象里取对应层级。
最直接的写法
用.loc[:]选中所有行(这里的:表示匹配所有行),然后直接访问索引的age层级:
age_index = test2.loc[:].index.get_level_values('age')
更体现.loc切片逻辑的写法
如果想严格用.loc的多级索引切片语法(比如先筛选部分行再提取索引),可以这样:
# 选中所有credit_score和age对应的行(slice(None)表示匹配当前层级所有值) filtered = test2.loc[(slice(None), slice(None)), :] # 提取age索引列 age_index = filtered.index.get_level_values('age')
要是只想提取特定条件下的age索引,比如credit_score为608或699的行,.loc的优势就体现出来了:
filtered = test2.loc[( [608, 699], slice(None) ), :] age_index = filtered.index.get_level_values('age')
把索引转成普通数据列的写法
如果要把age索引转换成DataFrame的普通列,结合.loc可以这么写:
age_column = test2.loc[:].reset_index()['age']
.loc[]的通用性说明
对于多级索引,.loc的核心是按标签精准定位,支持几种常用语法:
- 元组指定各层级标签:
test2.loc[(608, 42), :]选中credit_score=608且age=42的行 slice(None)匹配层级所有值:test2.loc[(slice(None), 42), :]选中所有age=42的行,不管credit_score是多少- 列表指定多个标签:
test2.loc[( [608, 502], [42, 41] ), :]选中指定组合的行
虽然.loc不能直接“提取”索引列,但它能灵活筛选行范围,之后再从筛选结果的索引里获取目标层级,这就是它的通用性所在——不管你需要什么范围的行,都能用.loc先定位,再处理索引或数据。
内容的提问来源于stack exchange,提问作者anumberofthem
相关产品推荐
相关产品推荐

