我只想保留Dataframe
的行,其中包含以下条件:开始条件为col1 = 0, col2 = 1
且区间结束col1 = 0, col2 = 2
的区间(包含)。< / p>
import pandas as pd
pd.DataFrame({'id':['id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id2','id2','id2','id2','id2']
,'col1':[0,1,1,0,1,0,0,1,1,0,0,1,0,0,1,1],'col2':[1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2]})
col1 col2 id
0 0 1 id1
1 1 2 id1
2 1 2 id1
3 0 1 id1
4 1 2 id1
5 0 2 id1
6 0 1 id1
7 1 2 id1
8 1 2 id1
9 0 2 id1
10 0 1 id1
11 1 2 id2
12 0 2 id2
13 0 1 id2
14 1 2 id2
15 1 2 id2
我们可以意识到只有&#34;块&#34;或0-1,0-2
中col1,col2
的间隔。
col1 col2 id
3 0 1 id1
4 1 2 id1
5 0 2 id1
6 0 1 id1
7 1 2 id1
8 1 2 id1
9 0 2 id1
10 0 1 id1
11 1 2 id2
12 0 2 id2
结果行0,1,2,13,14,15被删除,因为它们不是0-1,0-2区间。
答案 0 :(得分:3)
使用新的group
段(使用df.drop('group',1)
删除它)
设置
df['group']=(df.col1==0)&(df.col2==1)
df['group']=df['group'].cumsum()
选项1
mask=df.groupby('group').apply(lambda x : sum((x.col1==0)&(x.col2==2)))
df.loc[df.group.isin(mask[mask.eq(1)].index)]
Out[363]:
col1 col2 id group
3 0 1 id1 2
4 1 2 id1 2
5 0 2 id1 2
6 0 1 id1 3
7 1 2 id1 3
8 1 2 id1 3
9 0 2 id1 3
10 0 1 id1 4
11 1 2 id2 4
12 0 2 id2 4
备选案例2提及 @Bharathshetty
mask=df.groupby('group').last().loc[lambda x : (x.col1==0)&(x.col2==2),].index
df.loc[df.group.isin(mask)]
Out[379]:
col1 col2 id group
3 0 1 id1 2
4 1 2 id1 2
5 0 2 id1 2
6 0 1 id1 3
7 1 2 id1 3
8 1 2 id1 3
9 0 2 id1 3
10 0 1 id1 4
11 1 2 id2 4
12 0 2 id2 4