数据帧模式版由两列条件组成

时间:2017-10-10 07:00:31

标签: pandas dataframe data-cleaning

我只想保留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-2col1,col2的间隔。但是,有时候我们没有(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)

1 个答案:

答案 0 :(得分:1)

这是使用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