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

按ID删除Dataframe中‘Deletion Request’及之后的行

Pandas按ID删除指定行之后的所有记录

问题描述

我有如下结构的DataFrame:

IDActivity
100Create Account
100Verify Account
100Deletion Request
100E-Mail Request
200Create Account
200Deletion Request
300Create Account

需要针对每个ID,删除Activity列中“Deletion Request”(包含该行)之后的所有行,处理后的结果如下:

IDActivity
100Create Account
100Verify Account
200Create Account
300Create Account

我当前的方法是用df["ID"].value_counts()遍历所有ID,获取“Deletion Request”首次出现到该ID范围末尾的索引,但觉得这个方法不够高效,想找更好的实现方式。

高效实现方案

可以通过分组标记+向量化过滤的方式实现,完全避免循环遍历,效率提升明显:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'ID': [100, 100, 100, 100, 200, 200, 300],
    'Activity': ['Create Account', 'Verify Account', 'Deletion Request', 'E-Mail Request', 'Create Account', 'Deletion Request', 'Create Account']
})

# 标记所有Deletion Request行
df['is_deletion'] = df['Activity'] == 'Deletion Request'

# 按ID分组,计算累计标记:一旦出现Deletion,后续行都标记为需剔除
df['keep_row'] = df.groupby('ID')['is_deletion'].transform(lambda x: ~x.cumsum().astype(bool))

# 过滤保留行并清理临时列
final_df = df[df['keep_row']].drop(columns=['is_deletion', 'keep_row'])

print(final_df)

逻辑说明

  1. 标记目标行:用布尔列快速定位所有“Deletion Request”记录;
  2. 分组累计判断:按ID分组后,cumsum()会把组内从第一个Deletion开始的所有行累计为≥1的数值,转成布尔值后代表“需剔除”,取反后就是要保留的行;
  3. 过滤清理:筛选出需保留的行,删除临时辅助列得到最终结果。

这种向量化操作的时间复杂度远低于循环遍历,数据量越大,效率优势越显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:04:57