按列条件清理数据帧

时间:2017-10-09 13:14:27

标签: python 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的间隔。

   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区间。

1 个答案:

答案 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