You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas多层索引切片:先选两级索引再选列的实现方法

处理MultiIndex DataFrame的索引筛选+列选择问题

嘿,这个需求我之前也碰到过,Pandas里其实有好几种简单的方法能实现,我先把你的示例代码补全(你之前列名那里没写完),然后一步步给你演示:

首先,先把可运行的示例代码写出来:

import numpy as np
import pandas as pd
# 创建两级MultiIndex
a = pd.MultiIndex.from_arrays(
    np.array([np.repeat([1, 2], 6), np.tile(np.repeat(["a", "b", "c"], 2), 2)] )
)
# 补全列名,生成完整DataFrame
df = pd.DataFrame(np.random.randn(12,4), index=a, columns=['col1', 'col2', 'col3', 'col4'])

接下来给你介绍三种常用的实现方式:

方法1:用.loc一步到位(最简洁)

.loc索引器支持直接传入多级索引的筛选条件,同时指定要选择的列,非常高效。
比如你想筛选第一级索引为1、第二级索引为'a'和'b',然后选择col1和col3:

# 元组的每个元素对应一级索引的筛选值,列表表示该级要保留的多个值
filtered_df = df.loc[ ( [1], ['a', 'b'] ), ['col1', 'col3'] ]

如果要筛选第一级索引为1和2、第二级索引为'b'和'c',再选col2和col4,直接修改参数就行:

filtered_df = df.loc[ ( [1,2], ['b','c'] ), ['col2','col4'] ]

方法2:用pd.IndexSlice让逻辑更清晰

当索引层级多、筛选条件复杂时,用IndexSlice能让代码可读性更高:

# 先定义索引切片器
idx = pd.IndexSlice
# 筛选第一级索引1/2,第二级索引a/b,选择col2和col4
filtered_df = df.loc[ idx[ [1,2], ['a','b'] ], ['col2','col4'] ]

这种方式还支持条件筛选,比如你想筛选**第一级索引大于1、第二级索引为'b'**的行,再选所有列:

filtered_df = df.loc[ idx[ df.index.get_level_values(0) > 1, 'b' ], : ]

方法3:分步操作(适合初学者理解)

如果你觉得上面的方法有点绕,可以拆成两步:先筛选符合条件的行,再选择特定列:

# 第一步:生成布尔索引,筛选第一级是1、第二级是'a'或'c'的行
index_filter = df.index.get_level_values(0).isin([1]) & df.index.get_level_values(1).isin(['a','c'])
temp_df = df[index_filter]
# 第二步:选择需要的列
final_df = temp_df[['col1','col4']]

这几种方法都能满足你的需求,你可以根据自己的场景选最顺手的~

内容的提问来源于stack exchange,提问作者viloflo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:44:39