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

如何用pd.IndexSlice在双层MultiIndex数据框中同时切片行与列

使用pd.IndexSlice对MultiIndex列进行切片

问题背景

已有双层行MultiIndex的数据框,会用pd.IndexSlice做行切片,现在需要用同样方法对三层列MultiIndex进行筛选,目标是保留KIND=ACTIVE且DEPARTMENT=A2的列。

示例数据生成代码

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randint(0, 10, size=(9, 5)))
# 构建行MultiIndex
list1 = ['2021-01-01','2022-02-01','2022-03-01']
list2 = ['PHOTO', 'QUE','TXR']
combinations = [(x, y) for x in list1 for y in list2]     
df.index = pd.MultiIndex.from_tuples(combinations, names = ["DATE","DB"])
# 构建列MultiIndex
list1c = [('AB30','ACTIVE','A2'),('CD55','ACTIVE','A1'),('ZT52','UNACTIVE','A2'),('MIKE','PENSIONER','A2'),('ZZ00001','ACTIVE','A1')]
df.columns = pd.MultiIndex.from_tuples(list1c, names = ["UserID","KIND","DEPARTMENT"])

完整的行+列切片代码

idx = pd.IndexSlice

###### 行切片 #######
date_start = '2021-01-01'
date_end   = '2021-02-01'
databases = ['PHOTO','QUE']
i_s = idx[date_start:date_end, databases]

###### 列切片 #######
# 筛选KIND=ACTIVE且DEPARTMENT=A2的列,UserID不限
i_c = idx[:, 'ACTIVE', 'A2']

# 同时应用行和列切片
result_df = df.loc[i_s, i_c]
print(result_df)

列切片逻辑说明

列MultiIndex的层级顺序是["UserID","KIND","DEPARTMENT"],idx[:, 'ACTIVE', 'A2']的含义是:

  • 第一个::匹配所有UserID层级的内容
  • 第二个'ACTIVE':匹配KIND层级等于ACTIVE的项
  • 第三个'A2':匹配DEPARTMENT层级等于A2的项

如果需要更复杂的列筛选,可灵活调整:

  • 筛选多个KIND值:i_c = idx[:, ['ACTIVE', 'UNACTIVE'], 'A2']
  • 指定UserID范围+条件:i_c = idx[['AB30', 'MIKE'], 'ACTIVE', 'A2']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:55:23