基于多行列匹配移除Pandas数据行,筛选仅保留Added行
Pandas 处理成对 Added/Removed 行并保留有效 Added 行
需求说明:
在已完成Event_Time转datetime类型、按Name分组并按时间排序的Pandas DataFrame中,移除所有满足「前一行Action为Added且当前行Action为Removed」的成对行,最终仅保留有效的Added行。
示例输入数据:
import pandas as pd df = pd.DataFrame({'Event_Time': ['2024-05-28 12:37:00', '2024-05-28 12:41:00', '2024-05-28 16:12:00','2024-05-08 09:40:00'], 'Name': ['Kenzie Doe', 'Kenzie Doe', 'Kenzie Doe', 'Abby Stone'], 'Action': ['Added', 'Removed', 'Added', 'Added']})
解决方案
Python完全支持这类多行列操作,具体步骤如下:
- 预处理:转换时间类型并排序
确保Event_Time为可排序的datetime类型,再按Name分组、时间排序:
df['Event_Time'] = pd.to_datetime(df['Event_Time']) df = df.sort_values(['Name', 'Event_Time']).reset_index(drop=True)
- 标记需要删除的成对行
先定位「当前行是Removed且前一行是Added」的行,再把对应的前一行也标记为待删除:
# 标记当前行是Removed且前一行是Added的情况 mask_remove = (df['Action'] == 'Removed') & (df['Action'].shift(1) == 'Added') # 扩展标记到对应的前一行(Added行) mask_to_drop = mask_remove | mask_remove.shift(-1).fillna(False)
- 过滤并保留有效Added行
剔除标记的行后,再筛选出Action为Added的行:
result = df[~mask_to_drop].query("Action == 'Added'").reset_index(drop=True)
最终结果
| Event_Time | Name | Action |
|---|---|---|
| 2024-05-08 09:40:00 | Abby Stone | Added |
| 2024-05-28 16:12:00 | Kenzie Doe | Added |
内容的提问来源于stack exchange,提问作者Zayetzy Luna
相关产品推荐
相关产品推荐

