基于列值筛选/查询Pandas多级索引DataFrame
解决Pandas多级列DataFrame按日期筛选的索引对齐问题
问题背景
有一个以DatetimeIndex为索引的Pandas多级列DataFrame,需要按日期依次遍历,筛选出满足以下任一条件的数据:
- Symbols对应的
ClosegtSMA13字段值为True Close字段值大于SMA13字段值
筛选完成后需进行后续处理,例如计算每日MTDPerf指标的排名,但过程中遇到了索引对齐错误。
可行解决方案
参考@jezrael的方法,使用Pandas的where()函数完成筛选,可有效避免索引对齐问题,后续处理逻辑也能顺利执行。
代码实现
方式1:按日期遍历处理
# 遍历每个唯一日期 for date in df.index.unique(): # 获取当日数据 daily_df = df.loc[date] # 用where筛选满足条件的行,不满足的设为NaN filtered_df = daily_df.where( (daily_df['ClosegtSMA13'] == True) | (daily_df['Close'] > daily_df['SMA13']) ).dropna(how='all') # 后续处理:计算每日MTDPerf排名 filtered_df['MTDPerf_Rank'] = filtered_df['MTDPerf'].rank(ascending=False) # 自定义其他处理逻辑 print(f"日期 {date.strftime('%Y-%m-%d')} 处理结果:") print(filtered_df[['MTDPerf', 'MTDPerf_Rank']])
方式2:按日期分组批量处理(更高效)
def process_daily_data(group): # 构建筛选条件掩码 mask = (group['ClosegtSMA13'] == True) | (group['Close'] > group['SMA13']) # 筛选有效数据 filtered = group[mask] # 计算MTDPerf排名 filtered['MTDPerf_Rank'] = filtered['MTDPerf'].rank(ascending=False) return filtered # 按日期索引分组并应用处理函数 final_result = df.groupby(level=0).apply(process_daily_data)
方案说明
where()函数会保留原DataFrame的索引与列结构,仅将不满足条件的单元格设为NaN,后续通过dropna()移除无效行即可。这种方式避免了直接筛选时可能触发的索引对齐冲突,尤其适配多级列+日期索引的复杂结构场景。
内容的提问来源于stack exchange,提问作者Nikhil Mulley
相关产品推荐
相关产品推荐

