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

Pandas排序多层索引DataFrame按累积和阈值筛选分组内指定行

解决方案

报错原因

原有逻辑的报错根因是:当分组内所有行的cumsum都小于0.2时,df.loc[df['cumsum'] > 0.2]返回空结果,此时取index[0]会触发索引越界异常。

推荐实现(Pandas原生写法,无需手动循环)

通过groupby+自定义过滤函数实现,自动兼容所有cumsum都小于0.2的场景,代码如下:

import pandas as pd

def filter_cumsum_group(group):
    # 标记所有cumsum大于0.2的行
    over_mask = group['cumsum'] > 0.2
    if over_mask.any():
        # 存在大于0.2的行时,取到第一个符合条件的行为止
        first_over_pos = group.index.get_loc(over_mask.idxmax()) + 1
        return group.iloc[:first_over_pos]
    else:
        # 所有行cumsum都小于0.2时,返回完整分组
        return group

# 按第一级索引name分组应用过滤规则,group_keys避免额外增加索引层级
result_df = df.groupby(level='name', group_keys=False).apply(filter_cumsum_group)

原有循环逻辑的修复版本

如果要保留你原有的循环写法,只需要增加存在性判断即可:

result_list = []
# 遍历每个name分组
for name, group_df in df.groupby(level='name'):
    over_mask = group_df['cumsum'] > 0.2
    if over_mask.any():
        idx = group_df.loc[over_mask].index[0]
        iidx = group_df.index.get_loc(idx) + 1
        result_list.append(group_df.iloc[:iidx])
    else:
        # 没有大于0.2的行时直接追加全部分组
        result_list.append(group_df)

# 合并所有分组结果
result_df = pd.concat(result_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:04