繁体   English   中英

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

[英]Dropping rows based on complex conditions involving multiple columns

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条件,但是有没有更简单的选择? 任何帮助将不胜感激。 谢谢。

使用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 ,如果不等于0通过行的每个值all

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

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

Pandas允许您使用非常简单的选择语法,如下所示:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM