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

