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

2024-10-05 14:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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,if任何其他变量=0的所有行。我曾想过使用if-else条件,但有更简单的替代方法吗?任何帮助都将不胜感激。谢谢


Tags: 数据idifs3outheadelseclass
2条回答

使用^{}

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,则按^{}对行的每个值进行比较:

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

所以它会过滤Trues:

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)] 

相关问题 更多 >