使用条件pandas删除行



我的目标是在熊猫df中删除特定行出现顺序错误的行。使用下面,序列的开头由Item中的Start概述。

序列在Start

值之前结束。我要删除等于AB的行,其中给定的序列确实包含来自End的任何字符串(在下一个Start之前)。

注意:ABStart之前的行数是随机的。

df = pd.DataFrame({      
'Num' : [1,2,3,4,6,7,9,10,12,13,14,15,16,17],
'Item' : ['Start','A','B','B','G','Start','A','B','B','A','X','Start','A','H'],        
})

Val = ['A','B']
End = ['X','Y','Z']
g = df['Item'].isin(Val).groupby(df['Item'].eq('Start').cumsum())
cond1 = g.transform('sum')>=1
cond2 = g.transform('idxmax')
out = df[cond1 & (df.index<=cond2)]
p>
Num   Item
0     1  Start
1     2      A # No value in End before next Start. Drop
2     3      B # No value in End before next Start. Drop
3     4      B # No value in End before next Start. Drop
4     6      G
5     7  Start
6     9      A # X appears before next Start. Keep
7    10      B # X appears before next Start. Keep
8    12      B # X appears before next Start. Keep
9    13      A # X appears before next Start. Keep
10   14      X
11   15  Start
12   16      A # No value in End before next Start. Drop
13   17      H

目的输出:

Num   Item
0     1  Start
4     6      G
5     7  Start
6     9      A 
7    10      B 
8    12      B 
9    13      A 
10   14      X
11   15  Start
13   17      H

iuc,这是一个可行的解决方案。它使用start来定义偶数和奇数组,并从Val中删除匹配偶数组的值。

如果这不是你想要的,请提供一个反例和匹配的预期输出。

starts = df['Item'].eq('Start')
to_drop = starts.cumsum().add(1).mul(~starts)%2*df['Item'].isin(Val)
df.loc[to_drop[to_drop.eq(0)].index]

输出:

Num   Item
0     1  Start
1     2      A
2     3      B
3     4      X
4     6  Start
8    12      G
9    13  Start
10   14      A
11   15      B
12   17      Y
13   18      Z

最新更新