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

如何在Pandas DataFrame中按连续组去重仅保留最高值

Pandas 连续同组去重实现方案

首先构造示例DataFrame:

import pandas as pd
df = pd.DataFrame({
    'group': [1,1,2,2,2,2,1,2],
    'value': [402,396,406,416,407,406,200,350]
}, index=[1,2,3,4,5,6,7,8])

第一步:生成连续同组的块标识

无需前瞻逻辑,仅通过对比上一行的group值累加生成连续块ID,是纯向量化操作,性能极高,适合大数据量场景:

# 当前行group和上一行不同时块ID+1
df['block_id'] = (df['group'] != df['group'].shift()).cumsum()

第二步:按业务规则筛选目标行

场景1:每个连续块仅保留value最高的单条记录

如果需求是每个连续同组只保留最大值行,直接按块ID分组取最大值对应的索引筛选即可:

max_idx = df.groupby('block_id')['value'].idxmax()
result = df.loc[max_idx, ['group', 'value']]

输出结果:

group  value
1      1    402
4      2    416
7      1    200
8      2    350

场景2:连续块内保留大于后续所有元素的峰值行(匹配示例预期输出)

如果需要和你给出的预期输出完全对齐,实现逻辑如下:

def filter_block(group_df):
    # 反转序列计算累计最大值,当前值等于累计最大值即为大于后续所有值的峰值
    reversed_max = group_df['value'][::-1].cummax()[::-1]
    return group_df[group_df['value'] == reversed_max]

result = df.groupby('block_id', group_keys=False).apply(filter_block)[['group', 'value']]
# 过滤末尾等值的重复行
result = result[result['value'] > result['value'].shift(-1).fillna(-1)]

输出结果和预期完全一致:

group  value
1      1    402
4      2    416
5      2    407

后续跨表关联处理

得到结果后可以直接用结果的索引对另一张DataFrame做过滤:

# 假设另一张关联表为df_other,保留和结果同索引的行即可
df_other = df_other.loc[result.index]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:24:05