基于条件删除布尔值行:删除仅NIT/FIB为True的DataFrame行
解决DataFrame删除特定行的问题
没问题,我来帮你搞定这两个删除需求。咱们用pandas来处理,思路很清晰——通过筛选保留符合要求的行(也就是排除掉你要删除的行),这种方式比直接drop更直观,也不容易出错。
先明确前提:从你的示例来看,number是数值列,剩下的ISM、AAAL、GSOG、GSI、AN、NIT、FIB都是布尔型列(值为True/False)。我们的目标是删除两类行:
1. 删除所有NIT为True且其余布尔列均为False的行
先定义所有布尔列的列表,然后构建筛选条件,保留不满足删除条件的行:
import pandas as pd # 假设你的DataFrame已经是df了 bool_cols = ['ISM', 'AAAL', 'GSOG', 'GSI', 'AN', 'NIT', 'FIB'] # 筛选并保留:排除「NIT为True + 其他所有布尔列全为False」的行 df = df[~((df['NIT'] == True) & ((df[bool_cols].drop('NIT', axis=1) == False).all(axis=1)))]
代码解释:
~是取反操作,因为我们要保留不满足删除条件的行df['NIT'] == True定位到NIT为True的行(df[bool_cols].drop('NIT', axis=1) == False).all(axis=1)检查除NIT外的所有布尔列是否全为False,all(axis=1)表示按行判断所有列是否都满足条件&表示两个条件必须同时满足,取反后就得到我们需要保留的行
2. 删除所有FIB为True且其余布尔列均为False的行
逻辑和上面完全一致,只是把目标列换成FIB即可:
# 筛选并保留:排除「FIB为True + 其他所有布尔列全为False」的行 df = df[~((df['FIB'] == True) & ((df[bool_cols].drop('FIB', axis=1) == False).all(axis=1)))]
可选简化写法(适合列少的情况)
如果你的布尔列不多,也可以用query方法直接写条件,更直观:
# 删除NIT符合条件的行 df = df.query("not (NIT == True and ISM == False and AAAL == False and GSOG == False and GSI == False and AN == False and FIB == False)") # 删除FIB符合条件的行 df = df.query("not (FIB == True and ISM == False and AAAL == False and GSOG == False and GSI == False and AN == False and NIT == False)")
这种写法虽然直白,但如果布尔列很多的话,还是前面的方法更高效,不用手动列所有列名。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

