如何在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
相关产品推荐
相关产品推荐

