我的目标是在熊猫df中删除特定行出现顺序错误的行。使用下面,序列的开头由Item
中的Start
概述。
Start
值之前结束。我要删除等于A
或B
的行,其中给定的序列确实包含来自End
的任何字符串(在下一个Start
之前)。
注意:A
或B
在Start
之前的行数是随机的。
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