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

