如何用Pandas的loc切片多层索引第二层?支持列表切片吗?
好问题!针对你这种三级MultiIndex的DataFrame,想要单独对第二层索引做切片,还支持用列表批量筛选的需求,Pandas有几种很实用的方法,我给你一步步讲清楚:
方法1:用
pd.IndexSlice(最推荐,可读性高) 这是Pandas专门为多级索引设计的切片工具,非常适合复杂的索引筛选场景。用法很简单:
首先确保导入(如果没导入的话):
import pandas as pd
针对你的需求,要筛选第二层索引是['Paddy rice', 'Wheat']的所有行,代码如下:
# 冒号表示匹配该层级的所有值,中间的列表就是你要筛选的第二层索引值 filtered_z = z.loc[pd.IndexSlice[:, ['Paddy rice', 'Wheat'], :]]
解释:
- 第一个
::匹配第一层索引的所有值(比如你的例子里的'AT'、其他国家代码等) - 中间的列表:精确匹配第二层索引的指定值
- 第三个
::匹配第三层索引的所有值(比如'M.EUR'等区域代码)
方法2:直接使用元组+
slice(None) 如果不想额外导入IndexSlice,可以用元组配合slice(None)来替代冒号(因为在元组里不能直接写冒号),代码如下:
filtered_z = z.loc[(slice(None), ['Paddy rice', 'Wheat'], slice(None))]
这里slice(None)的作用和冒号完全一样,代表匹配该层级的所有元素,效果和方法1完全相同。
方法3:用
xs方法(适合快速按层级筛选) 如果你的多级索引有明确的层级名称,或者你想快速定位某一层级,xs方法也可以实现列表筛选,记得加上drop_level=False来保留所有索引层级(默认会删掉筛选的层级):
# level=1表示第二层索引(索引层级从0开始计数) filtered_z = z.xs(['Paddy rice', 'Wheat'], level=1, drop_level=False)
额外小提示:
如果只是筛选单个第二层索引值,比如只取'Paddy rice',可以直接简化成z.loc[:, 'Paddy rice', :];但要批量筛选多个值(列表形式),就必须用上面三种方法里的任意一种,不然会触发Pandas的索引匹配错误。
内容的提问来源于stack exchange,提问作者LeoIE
相关产品推荐
相关产品推荐

