按两列条件编辑数据框模式

Dataframe pattern edition by two columns condition

我只想保留具有以下条件的 Dataframe 的行:开始条件为 col1 = 0, col2 = 1 的间隔(包括)和结束条件为 col1 = 0, col2 = 2 .

示例数据

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

我们可以认识到,在一般情况下,col1,col2中有"blocks"或0-1,0-2的区间。但是,有时我们没有 (0-2) 结尾,所以 id 的最后 1-2 将是块的结束表达式,我们将不得不编辑此行(替换 col1 1 = 0)以便在与其他块相同的格式。请参阅第 2 行和第 15 行(所需更改)。

示例输出。

   col1 col2 id 
0   0   1   id1 
1   1   2   id1 
2   0   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  0   2   id2 

现在每个块以 (0-1) 开始并以 (0-2) 结束

这是使用 apply

的一种方法
In [303]: def chg_last(x):
     ...:     x.iloc[-1] = 0
     ...:     return x

In [304]: df.col1 = (df.groupby((df.col2.shift().eq(2) & df.col2.eq(1)).cumsum())
                       .col1.apply(chg_last))

In [305]: df
Out[305]:
    col1  col2   id
0      0     1  id1
1      1     2  id1
2      0     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     0     2  id2

详情

识别组

In [308]: (df.col2.shift().eq(2) & df.col2.eq(1)).cumsum()
Out[308]:
0     0
1     0
2     0
3     1
4     1
5     1
6     2
7     2
8     2
9     2
10    3
11    3
12    3
13    4
14    4
15    4
Name: col2, dtype: int32