如何获取MultiIndex DataFrame中idx_two不等于x的所有行?
筛选MultiIndex中idx_two不等于x的行
嘿,我明白你遇到的问题了——处理MultiIndex的时候确实容易在层级索引上踩小坑,不过别担心,这有两种简单可靠的方法来实现你的需求:
方法1:使用get_level_values + 布尔索引
你之前尝试的get_level_values思路是完全对的,可能只是在层级指定或者条件写法上出了点小问题。我们需要明确指定要筛选的是idx_two这个层级,然后生成布尔掩码来过滤行:
首先先构造你的示例DataFrame(方便你复现验证):
import pandas as pd # 创建MultiIndex行索引 index = pd.MultiIndex.from_tuples( [(2, 'a'), (0, 'b'), (2, 'x'), (0, 'd'), (3, 'x'), (2, 'e'), (3, 'x')], names=['idx_one', 'idx_two'] ) # 创建多级列索引 columns = pd.MultiIndex.from_product( [pd.date_range('2000-02-01', '2000-03-01', freq='MS'), ['sub_col_one', 'sub_col_two']] ) # 填充数据 data = [ [5, 2, 3, 3], [0, 5, 8, 1], [0, 0, 6, 1], [8, 3, 5, 5], [5, 6, 5, 9], [2, 5, 0, 5], [1, 7, 4, 4] ] df = pd.DataFrame(data, index=index, columns=columns)
接下来就是筛选的核心代码:
# 获取idx_two层级不等于'x'的行 filtered_df = df[df.index.get_level_values('idx_two') != 'x']
执行后得到的结果就是你想要的:
2000-02-01 2000-03-01 sub_col_one sub_col_two sub_col_one sub_col_two idx_one idx_two 2 a 5 2 3 3 0 b 0 5 8 1 0 d 8 3 5 5 2 e 2 5 0 5
方法2:使用query方法(更简洁直观)
如果你喜欢更清爽的语法,pandas的query方法也能轻松处理MultiIndex的筛选,直接用层级名称指定即可:
filtered_df = df.query("idx_two != 'x'")
这个方法的结果和上面完全一致,代码可读性更高。
为什么之前用get_level_values没得到预期结果?
大概率是这两个原因之一:
- 你可能用了数字索引指定层级,但搞反了层级顺序(比如把
idx_two的层级序号写错了),建议直接用层级名称'idx_two'来指定,避免混淆; - 布尔条件写反了(比如写成了
== 'x'),或者没有把生成的掩码正确应用到DataFrame上。
内容的提问来源于stack exchange,提问作者Alex-droid AD
相关产品推荐
相关产品推荐

