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

