如何一次性获取Pandas多级索引DataFrame的多个切片?
Pandas多级索引(Multi-Index)多层级切片方法
你遇到的问题是把行索引的层级参数错误放到了列参数位置,df.loc[]的第一个位置对应行索引,第二个位置对应列,所以之前的写法会把-1当成列名查找,自然抛出KeyError。
下面是几种正确的多层级切片实现方式:
方法1:用元组列表指定行索引组合
如果要同时指定第一层级取[0,1,2]、第二层级固定为-1,可以用元组列表描述行索引的组合关系:
# 筛选A=0/1/2 且 B=-1的所有行 df.loc[ [(0,-1), (1,-1), (2,-1)] ]
输出结果:
D E A B C 0 -1 20 30 40 1 -1 21 31 41 2 -1 22 32 42
方法2:使用pd.IndexSlice(更灵活)
如果需要处理复杂切片场景(比如某一层级取范围、另一层级取固定值),pd.IndexSlice是更便捷的选择:
import pandas as pd # 定义切片器 idx = pd.IndexSlice # 第一层级取0/1/2,第二层级取-1,第三层级任意 df.loc[idx[[0,1,2], -1, :]]
这种方式支持更灵活的组合,比如要精准定位A=0/1/2、B=-1、C=20/22的行,可写成:
df.loc[idx[[0,1,2], -1, [20,22]]]
方法3:使用xs方法(单一层级快速筛选)
如果只是固定某一层级的值,同时筛选另一层级,xs方法也适用:
# 先筛选B=-1的所有行,再取A=0/1/2的部分 df.xs(-1, level='B').loc[[0,1,2]]
也可以反向操作:
df.xs([0,1,2], level='A', drop_level=False).xs(-1, level='B')
报错原因说明
你之前写的df.loc[[0,1,2], -1]中,loc的第二个参数-1会被识别为列名,但你的数据列只有D和E,因此抛出KeyError;df.loc[[0,1,2], [-1]]同理,把[-1]当成列名列表查找,自然找不到匹配项。
内容的提问来源于stack exchange,提问作者YGA
相关产品推荐
相关产品推荐

