根据涉及多列的复杂条件删除行

时间:2018-02-15 13:49:42

标签: python pandas

aps1_risk.head()
Out[33]: 
   ID  class     S3   S22  S23   S26_3  S28  S29            
0   1      1  45698  1012  268  287230    0   10           
1   2      0      0     0    0  154298   86  454           
2   3      0    228   358  110  254892  128  202           

在这个给定的数据集中,我需要删除class = 1的所有行,如果任何其他变量= 0.我想过使用if else条件,但是有更简单的替代方法吗?任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

使用boolean indexing

df = aps1_risk[aps1_risk.drop('class', 1).ne(0).all(1) | aps1_risk['class'].ne(1)]

通过~反转最终掩码的替代解决方案:

df = df[~(df.drop('class', 1).eq(0).any(1) & df['class'].eq(1))]
print (df)
   ID  class   S3  S22  S23   S26_3  S28  S29
1   2      0    0    0    0  154298   86  454
2   3      0  228  358  110  254892  128  202

<强>详细

如果不class,那么对于all的行的每个值,如果不等于0,则比较所有列:

print (df.drop('class', 1).ne(0).all(1))
0    False
1    False
2     True
dtype: bool

比较列,如果不等于1

print (df['class'].ne(1))
0    False
1     True
2     True
Name: class, dtype: bool

连锁条件:

print (df.drop('class', 1).ne(0).all(1) | df['class'].ne(1))
0    False
1     True
2     True
dtype: bool

所以它过滤了True s:

df = aps1_risk[aps1_risk.drop('class', 1).ne(0).all(1) | aps1_risk['class'].ne(1)]
print (df)
   ID  class   S3  S22  S23   S26_3  S28  S29
1   2      0    0    0    0  154298   86  454
2   3      0  228  358  110  254892  128  202

答案 1 :(得分:0)

Pandas允许您使用非常简单的选择语法:

aps1_risk = aps1_risk[aps1_risk['class'] != 1]

或者你可以像这样轰炸更复杂的查询:

aps1_risk = aps1_risk[(aps1_risk['class'] != 1) | (aps1_risk.drop('class', 1) == 0)]