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