对Pandas DataFrame应用含日期格式的多条件时报KeyError问题求解
报错原因
报错为KeyError: 'Vulnerability Since',核心原因是列名拼写不一致:
- 代码第5行你已经读取并处理了列名为
Vulnerable Since的日期列 - 但在后续
conditions数组的第二个及之后所有条件中,你错误将该列名拼写为Vulnerability Since(多了-ity后缀),pandas无法在DataFrame中找到不存在的列,因此抛出异常。
解决方法
方法1:直接修正拼写错误
将conditions中所有df['Vulnerability Since']替换为df['Vulnerable Since']即可,修正后的完整代码如下:
import pandas as pd import numpy as np df = pd.read_csv("Vulns_110421.csv") df['Vulnerable Since'] = pd.to_datetime(df['Vulnerable Since'], format='%Y/%m/%d') critical = pd.to_datetime('2021-10-2') severe = pd.to_datetime('2021-9-2') moderate = pd.to_datetime('2021-8-02') conditions = [ (df['Vulnerability CVSSv3 Score'] >= 7.5) & (df['Vulnerable Since'] <= critical), (df['Vulnerability CVSSv3 Score'] >= 7.5) & (df['Vulnerable Since'] > critical), (df['Vulnerability CVSSv3 Score'] >= 3.5) & (df['Vulnerability CVSSv3 Score'] < 7.5) & (df['Vulnerable Since'] <= severe), (df['Vulnerability CVSSv3 Score'] >= 3.5) & (df['Vulnerability CVSSv3 Score'] < 7.5) & (df['Vulnerable Since'] > severe), (df['Vulnerability CVSSv3 Score'] >= 0) & (df['Vulnerability CVSSv3 Score'] < 3.5) & (df['Vulnerable Since'] <= moderate), (df['Vulnerability CVSSv3 Score'] >= 0) & (df['Vulnerability CVSSv3 Score'] < 3.5) & (df['Vulnerable Since'] > moderate) ] values = ['Critical', 'Critical_Past_Due', 'Severe', 'Severe_Past_Due', 'Moderate', 'Moderate_Past_Due'] df['Kratos_Vuln_Severity'] = np.select(conditions, values) df.to_excel("Vulns_110421-B.xlsx")
方法2:规避后续拼写错误的优化方案
可以将常用列名提前赋值给变量,后续统一引用变量即可避免手误拼写问题,示例如下:
# 提前定义列名常量 DATE_COL = 'Vulnerable Since' CVSS_COL = 'Vulnerability CVSSv3 Score' # 后续引用统一用变量 df[DATE_COL] = pd.to_datetime(df[DATE_COL], format='%Y/%m/%d') # conditions里也直接用df[DATE_COL]、df[CVSS_COL]即可
辅助验证技巧
读取csv后可以先执行print(df.columns.tolist())打印所有列名,确认列名拼写与后续引用一致,提前发现类似问题。
内容的提问来源于stack exchange,提问作者spider23
相关产品推荐
相关产品推荐

