按列条件清洗数据框

4

我希望仅保留一个 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中仅存在0-1,0-2这些“块”或区间。

   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、0-2区间内,因此第0,1,2,13,14,15行都被删除了。
1个回答

3

使用新的para 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

@Bharathshetty提到的Option2案例

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

检查第三行是否为 3 1 1 id1 而不是 0。如果组以 (0,1) 开始并以 (0,2) 结束,则 Op 希望得到该组。 - Bharath M Shetty
@Bharathshetty 对不起,我无法理解,请您能否再详细解释一下? - BENY
请使用以下数据检查: df = pd.DataFrame({'id':['id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id2','id2','id2','id2','id2'] ,'col1':[1,1,1,1,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]}) - Bharath M Shetty
如果在某个ID中缺少(0,2)怎么办?我的意思是按照(0,1-0,2)进行分组,但是如果(0-2)缺失,则也要将其分组以保留在数据库中。例如:数据样本中的行为(0,1,2)。 - PeCaDe
@PeCaDe,您能再次展示一下数据和预期输出吗?很难澄清它。 - BENY
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接