Python 子集df,其中值后面跟着一个单独的值-值

Python 子集df,其中值后面跟着一个单独的值-值,python,pandas,Python,Pandas,使用下面的代码,我希望删除任何与X相等的行,这些行后面没有直接跟 前一行中的BKE或DKE。此外,BKE、DKE和X之间的时间应相同,否则也应删除X df = pd.DataFrame({ 'Time' : [1,1,1,2,2,2,3,3,3], 'Item' : ['A','BKE','X','Y','X','DKE','X','Y','X'], }) df: 预期产出: Time Item 0 1 A 1

使用下面的代码,我希望删除任何与
X
相等的行,这些行后面没有直接跟 前一行中的
BKE
DKE
。此外,
BKE
DKE
X
之间的时间应相同,否则也应删除
X

df = pd.DataFrame({      
    'Time' : [1,1,1,2,2,2,3,3,3],
    'Item' : ['A','BKE','X','Y','X','DKE','X','Y','X'],          
   })
df:

预期产出:

   Time Item
0     1    A
1     1  BKE
2     1    X
3     2    Y
4     2  DKE
5     3    Y

您可以分解您的条件,以提高可读性(并简化检查):

is_prev_ke=df['Item'].shift(1).isin({'BKE','DKE'})
is_x=(df['Item']='x')
上一次相同时间=df['time']==df['time']。移位(1,填充值=True)
newdf=df.loc[~is_x |(is_x&is_prev_ke&prev_same_time)]
检查示例:

cond=~is_x |(is_x&is_prev_ke&prev_same_time)
赋值(is_prev_ke=is_prev_ke,is_x=is_x,
上一次相同时间=上一次相同时间,秒=秒)
输出:

时间项为“上一个”或“上一个”相同的时间条件
0 1错误-错误-正确
1 1 BKE错误-错误-正确-正确
2 1 X真值
3 2 Y假假假真
4 2 X假-真-假
5.2 DKE假假真
6 3 X真-假-假
7 3 Y假假真
8 3 X假-真-假
   Time Item
0     1    A
1     1  BKE
2     1    X
3     2    Y
4     2  DKE
5     3    Y
>>> newdf
   Time Item
0     1    A
1     1  BKE
2     1    X
3     2    Y
5     2  DKE
7     3    Y