如何按多级索引的单个层级筛选Pandas DataFrame?
筛选多级索引Pandas DataFrame的指定层级
没问题!当你把time设为索引层级后,确实没法直接像普通列那样用df["time"]访问,但有好几种优雅的方法可以完成筛选,完全不用把索引变回列(避免数据冗余):
方法1:使用index.get_level_values()
这是最直接的方式,专门用来获取指定索引层级的所有值:
# 按索引层级名称筛选 filtered_df = df[df.index.get_level_values("time") > 1] # 也可以用层级位置(这里time是第二个索引,位置为1) filtered_df = df[df.index.get_level_values(1) > 1]
运行后就能得到time大于1的所有行,完全保留原有的多级索引结构。
方法2:使用query()方法(更简洁)
Pandas的query方法支持直接引用索引层级的名称,语法非常直观:
filtered_df = df.query("time > 1")
这种写法和你原本想写的df[df["time"] > 1]几乎一样,只是不需要把time作为列存在,非常方便。
方法3:使用loc结合索引切片(适合范围筛选)
如果你的索引是有序的,可以用loc做切片筛选,不过需要先确保time索引是有序的:
# 先按time层级排序 df_sorted = df.sort_index(level="time") # slice(None)表示匹配id层级的所有值,1:表示time大于1的部分 filtered_df = df_sorted.loc[(slice(None), 1):]
这种方法更适合连续的范围筛选场景,比如time在某个区间内的行。
验证结果
不管用哪种方法,最终得到的筛选结果都是:
val id time 1 2 3 2 2 4
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

