You need to enable JavaScript to run this app. pandas实现相邻行匹配校验:删除特定值后非指定取值的行
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 21:15:04