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

如何通过组首值与条件变化的最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:55:10