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

如何在MultiIndex数据框中筛选指定一级索引的日期区间行?

Pandas MultiIndex 筛选:一级索引匹配+二级日期区间筛选

问题背景

给定如下带MultiIndex(一级为颜色字符串、二级为DatetimeIndex)的Pandas数据框:

import pandas as pd

idx_str = [
    'blue', 'blue', 'blue', 'blue',
    'red', 'red', 'red', 'red'
]
idx_date = [
    pd.Timestamp('2010-01-01'), pd.Timestamp('2010-01-05'),
    pd.Timestamp('2010-01-06'), pd.Timestamp('2010-01-10'),
    pd.Timestamp('2010-01-01'), pd.Timestamp('2010-01-05'),
    pd.Timestamp('2010-01-06'), pd.Timestamp('2010-01-10')
]
data = [1,2,3,4,5,6,7,8]

df = pd.DataFrame(
    data=zip(idx_str, idx_date, data),
    columns=['idx_str', 'idx_dates', 'data'],
)
df.set_index([idx_str, idx_date], drop=True, inplace=True)

数据框输出:

data
blue 2010-01-01     1
     2010-01-05     2
     2010-01-06     3
     2010-01-10     4
red  2010-01-01     5
     2010-01-05     6
     2010-01-06     7
     2010-01-10     8

需求:筛选一级索引为'red'、二级DatetimeIndex在指定日期区间内的行(注:示例预期结果中的日期存在笔误,实际需根据真实业务区间调整,以下以筛选2010-01-01至2010-01-06区间为例)。

可行解决方案

方法1:先提取一级索引子集,再筛选日期

先用xs()提取一级索引为'red'的子数据框,再对二级日期索引做区间筛选:

# 提取red的子集
red_df = df.xs('red', level=0)
# 定义日期区间
start_date = pd.Timestamp('2010-01-01')
end_date = pd.Timestamp('2010-01-06')
# 筛选区间内的行
result = red_df[(red_df.index >= start_date) & (red_df.index <= end_date)]

输出结果:

data
2010-01-01     5
2010-01-05     6
2010-01-06     7

方法2:使用pd.IndexSlice结合loc切片

利用pd.IndexSlice构建MultiIndex的切片规则,直接通过loc完成筛选,保留原索引结构:

idx = pd.IndexSlice
# 筛选一级索引red,二级索引在指定区间内的行
result = df.loc[idx['red', '2010-01-01':'2010-01-06'], :]

输出结果:

data
red 2010-01-01     5
     2010-01-05     6
     2010-01-06     7

方法3:布尔索引筛选

通过获取MultiIndex各层级的值,构建布尔条件进行筛选:

# 构建筛选条件
condition = (df.index.get_level_values(0) == 'red') & \
            (df.index.get_level_values(1) >= pd.Timestamp('2010-01-01')) & \
            (df.index.get_level_values(1) <= pd.Timestamp('2010-01-06'))
# 应用条件筛选
result = df[condition]

输出结果与方法2完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:26:09