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

基于列值筛选/查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:01:47