按ID删除Dataframe中‘Deletion Request’及之后的行
Pandas按ID删除指定行之后的所有记录
问题描述
我有如下结构的DataFrame:
| ID | Activity |
|---|---|
| 100 | Create Account |
| 100 | Verify Account |
| 100 | Deletion Request |
| 100 | E-Mail Request |
| 200 | Create Account |
| 200 | Deletion Request |
| 300 | Create Account |
需要针对每个ID,删除Activity列中“Deletion Request”(包含该行)之后的所有行,处理后的结果如下:
| ID | Activity |
|---|---|
| 100 | Create Account |
| 100 | Verify Account |
| 200 | Create Account |
| 300 | Create 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)
逻辑说明
- 标记目标行:用布尔列快速定位所有“Deletion Request”记录;
- 分组累计判断:按ID分组后,
cumsum()会把组内从第一个Deletion开始的所有行累计为≥1的数值,转成布尔值后代表“需剔除”,取反后就是要保留的行; - 过滤清理:筛选出需保留的行,删除临时辅助列得到最终结果。
这种向量化操作的时间复杂度远低于循环遍历,数据量越大,效率优势越显著。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

