pandas实现相邻行匹配校验:删除特定值后非指定取值的行
基于相邻行关联规则的pandas表格清洗实现
需求说明
在使用pandas开展表格清洗时,需要实现以下行删除规则:
- 逐行校验
Item列取值:若某行的上一行Item值为Up或Left,则对当前行执行校验 - 校验规则:若当前行
Item取值不在['Right', 'Down']列表内,删除该行 - 其余不满足触发条件的行,全部保留
测试数据集构造
使用以下代码生成基础测试数据集:
import pandas as pd df = pd.DataFrame({ 'Label' : ['A','B','A','B','B','B','A','B','B','A','A','A'], 'Item' : ['X','Left','X','Left','Down','Right','Up','Y','Right','Y','Right','Up'], })
错误逻辑说明
此前尝试的筛选逻辑未达到预期效果,代码如下:
df1 = df[~(df['Item'].isin(['Up','Left']).shift(1)) & (df['Item'].isin(['Right','Down']))]
该逻辑的核心问题是条件错位:实际执行的筛选规则是「上一行不是Up/Left 且 当前行是Right/Down」,和需求的触发逻辑完全不符。
规则匹配标注
对基础数据集逐行做规则匹配,去留标注如下:
Label Item 0 A X 1 B Left 2 A X # Drop. 上一行是Left,当前值不在Right/Down范围内 3 B Left 4 B Down # Keep. 上一行是Left,当前值在Right/Down范围内 5 B Right 6 A Up 7 B Y # Drop. 上一行是Up,当前值不在Right/Down范围内 8 B Right 9 A Y 10 A Right 11 A Up
期望输出结果
应用规则后得到的清洗结果为:
Label Item 0 A X 1 B Left 3 B Left 4 B Down 5 B Right 6 A Up 8 B Right 9 A Y 10 A Right 11 A Up
正确实现代码
按照规则拆解逻辑,通过掩码计算实现筛选:
# 计算触发校验的掩码:上一行Item为Up/Left,第一行无上行值默认不触发 prev_trigger = df['Item'].isin(['Up', 'Left']).shift(1, fill_value=False) # 计算需要删除的行:触发校验 且 当前行Item不在Right/Down范围内 drop_mask = prev_trigger & ~df['Item'].isin(['Right', 'Down']) # 筛选保留的行,得到清洗结果 df_clean = df[~drop_mask]
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

