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

Python中按A列分组,筛选每组最后B=C行及之前数据的方法

解决方案

问题分析

你的代码问题在于反转了整个掩码而非按分组反转,导致cummax的计算不是基于每组的逆序,从而错误地选中了第一个匹配行及之前的内容。

修正后的代码(基于你的思路)

只需将反转和cummax的操作限定在每个分组内:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'A': [1,1,1,1,2,2,2,3,3,3],
    'B': [3,7,7,5,2,8,4,5,1,4],
    'C': [2,7,7,4,1,8,5,3,9,4]
})

mask = df['B'] == df['C']
# 按分组反转掩码→计算累积最大值→再反转回原顺序
rev_cummax = mask.groupby(df['A']).apply(lambda x: x[::-1].cummax()[::-1])
result = df[rev_cummax]

print(result)

更高效的实现方式

通过获取每组最后一个匹配行的索引,直接筛选符合条件的行:

# 获取每组中最后一个B==C的行索引
last_match_idx = df[df['B'] == df['C']].groupby('A').tail(1).index
# 为每行映射其分组对应的最后匹配索引
max_idx = df['A'].map(last_match_idx.to_series())
# 筛选索引≤最后匹配索引的行
result = df[df.index <= max_idx]

print(result)

输出结果

两种方法都会得到预期的结果:

A  B  C
0  1  3  2
1  1  7  7
2  1  7  7
4  2  2  1
5  2  8  8
7  3  5  3
8  3  1  9
9  3  4  4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:44:58