Pandas按case分组满足条件时删除组内最后一行的实现
Pandas 按分组规则删除目标行实现
- 核心判定逻辑:当某行满足三个条件时触发删除:属于所在
case分组的最后一行、该行action取值为A、同分组下该行的前一行(即分组倒数第二行)action取值为D - 实现过程无需遍历分组,完全依托pandas向量化运算完成,运行效率高
import pandas as pd # 构造原始数据 df1 = pd.DataFrame({ 'case': [1,1,1,1,1,1,2,2,2,2,6,6,6,6,6,3,3,3,3,3,3], 'action': ['A','B','C','B','D','A','B','B','D','A','B','B','D','A','F','A','B','C','B','D','A'] }) # 生成分组内的删除标记掩码 mask = ( # 定位每个分组的最后一行 (df1.groupby('case').cumcount(ascending=False) == 0) # 最后一行action为A & (df1['action'] == 'A') # 同分组内最后一行的前一个值(即倒数第二行)为D & (df1.groupby('case')['action'].shift(1) == 'D') ) # 过滤待删除行,重置索引得到最终结果 df2 = df1[~mask].reset_index(drop=True)
运行上述代码得到的df2与预期输出结构、取值完全一致,不会出现误删、漏删的情况。
注:上述代码适配当前数据的原始排序(即
case分组内的行顺序与业务流程顺序一致),如果原始数据存在顺序混乱,需要先按业务时间/流程字段排序后再执行判定逻辑。
内容的提问来源于stack exchange,提问作者Ralf Butler
相关产品推荐
相关产品推荐

