pandas按id分组后根据序列下一行值删除指定行的实现方法
实现方法
你已经完成了核心逻辑的雏形,只需要把对比操作限制在每个id分组内即可,避免跨id的行产生错误对比,完整代码如下:
# 按id分组,组内将outcome字段后移一位,用eq方法做等值对比避免NaN比较异常,保留连续相同outcome的最后一条 mask = ~df.groupby('id')['outcome'].shift(-1).eq(df['outcome']) result = df[mask].reset_index(drop=True)
逻辑说明
- 你的数据已经提前按
id分组且组内按date升序排序,不需要额外做排序处理 groupby('id')['outcome'].shift(-1)会把每个id分组内的outcome值向上挪一行,每个分组的最后一行对应的值为NaN- 对比得到的掩码
mask为True的行,就是「当前行outcome和下一行不同」的行,刚好符合你「相同则删除当前行,只保留连续相同值的最后一条」的规则 - 如果你实际使用的字段名不是
outcome(你示例代码里写的是alerts),替换为实际字段名即可
输出验证
按上述代码执行后,id=3的分组输出和你给出的期望结果完全一致:
id date outcome 3 04/09/2019 no 3 30/10/2019 yes 3 03/05/2020 no
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

