我只想保留具有以下条件的 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
的“ block ”或区间。
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 间隔内。
最佳答案
通过使用新的 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
Option2 案例提到者
@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
关于python - 按列条件清理数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46647408/