如何通过组首值与条件变化的最后cummax过滤Pandas分组?
解决方案
基于你已有的思路,我们可以通过以下步骤完成desired_cummax的生成和目标分组筛选:
步骤1:提取组级关键信息
先从原DataFrame中提取每个分组的首num、尾num,为后续规则判断做准备:
import pandas as pd df = pd.DataFrame( { 'group': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e'], 'num': [1, 2, 3, 1, 12, 12, 13, 2, 4, 2, 5, 6, 10, 20, 30] } ) # 获取每个组的首num、尾num group_stats = df.groupby('group').agg( first_num=('num', 'first'), last_num=('num', 'last') ).reset_index()
步骤2:生成desired_cummax和筛选标记
初始化第一组的desired_cummax为其尾num(第一组必保留),然后遍历后续分组,按规则更新cummax并标记是否保留该组:
# 初始化参数:第一组必保留,初始cummax为第一组的最后num desired_cummax = [group_stats.loc[0, 'last_num']] keep_group = [True] # 遍历后续分组 for i in range(1, len(group_stats)): current_first = group_stats.loc[i, 'first_num'] current_last = group_stats.loc[i, 'last_num'] prev_max = desired_cummax[-1] if current_first > prev_max: # 组首num大于当前cummax,更新cummax并标记保留 desired_cummax.append(current_last) keep_group.append(True) else: # 不更新cummax,标记不保留 desired_cummax.append(prev_max) keep_group.append(False) # 将结果合并到组统计信息中 group_stats['desired_cummax'] = desired_cummax group_stats['keep'] = keep_group
步骤3:映射标记并筛选结果
把保留标记映射回原DataFrame,筛选出符合条件的分组并输出:
# 将保留标记映射到原df df['keep'] = df['group'].map(group_stats.set_index('group')['keep']) # 筛选并按组输出结果 filtered_groups = df[df['keep']].groupby('group') for name, subset in filtered_groups: print(subset[['group', 'num']]) print()
最终输出
运行后会得到你预期的三个分组:
group num 0 a 1 1 a 2 2 a 3 group num 6 c 13 7 c 2 8 c 4 group num 12 e 10 13 e 20 14 e 30
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

