使用Pandas基于两列AND条件拆分数据时遇到问题求助
问题描述
我正在清理电子表格,现有包含Severity、Fixable、CVE、Date列的DataFrame(vulns_new_or_changed),希望将其中Severity为LOW且Fixable为FALSE的行拆分到lowAndUnfixable,剩余行保留在原DataFrame。
编写的代码如下:
mask = ( vulns_new_or_changed['Fixable'].isin(['FALSE']) ) & ( vulns_new_or_changed['Severity'].isin(['LOW']) ) lowAndUnfixable = vulns_new_or_changed.drop(vulns_new_or_changed[~mask].index) vulns_new_or_changed.drop(vulns_new_or_changed[mask].index, inplace = True)
示例数据:
Severity, Fixable, CVE, Date HIGH, TRUE, XXXXXX, Jan 2023 LOW, FALSE, XXXXXX, Mar 2023 LOW, TRUE, XXXXXX, MAY 2023
预期lowAndUnfixable的结果为:
LOW, FALSE, XXXXXX, Mar 2023
但实际执行时,使用[~mask]会得到0行,使用[mask]会选中所有行,如何解决?
问题原因
核心问题是数据类型或列值格式不匹配:
- 若
Fixable列被Pandas自动解析为布尔类型(值为True/False),但你用字符串'FALSE'匹配,会导致匹配逻辑完全错误——布尔值和字符串无法匹配,最终导致mask结果不符合预期。 - 若
Fixable/Severity是字符串类型,但存在大小写差异(如'false')、前后空格(如' FALSE '),也会导致isin匹配失败,进而让mask结果异常。
解决方案
步骤1:排查实际列值
先查看列的唯一值,确认数据格式:
print("Fixable列唯一值:", vulns_new_or_changed['Fixable'].unique()) print("Severity列唯一值:", vulns_new_or_changed['Severity'].unique())
步骤2:根据实际情况调整匹配逻辑
情况A:Fixable是布尔类型
直接用布尔值匹配:
mask = (vulns_new_or_changed['Fixable'] == False) & (vulns_new_or_changed['Severity'] == 'LOW')
情况B:Fixable是字符串类型(存在格式问题)
先清洗列值,统一格式后再匹配:
# 去除前后空格、统一转为大写 vulns_new_or_changed['Fixable'] = vulns_new_or_changed['Fixable'].str.strip().str.upper() vulns_new_or_changed['Severity'] = vulns_new_or_changed['Severity'].str.strip().str.upper() # 生成匹配掩码 mask = (vulns_new_or_changed['Fixable'] == 'FALSE') & (vulns_new_or_changed['Severity'] == 'LOW')
步骤3:简化拆分代码
用直接筛选的方式替代drop,更直观且不易出错:
# 筛选目标行到新DataFrame lowAndUnfixable = vulns_new_or_changed[mask].copy() # 从原DataFrame移除目标行(非inplace方式,更安全) vulns_new_or_changed = vulns_new_or_changed[~mask].copy() # 若要使用inplace方式: # vulns_new_or_changed.drop(vulns_new_or_changed[mask].index, inplace=True)
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

