如何用循环生成的新Severity值替换DataFrame对应列旧值?
替换DataFrame中Severity列的两种方法
你的现有代码里severity_levels函数只计算了每个CVSS对应的新Severity值,但没有把值写回DataFrame的Severity列,下面是两种可行的修改方案:
方案一:改进原有循环逻辑
直接遍历DataFrame的每一行,计算新值后覆盖原Severity列:
def severity_levels(df): for idx, row in df.iterrows(): cvss = float(row['CVSS']) if cvss < 4.0: s = "Low" elif 4.0 <= cvss < 7.0: s = "Moderate" else: s = "High" # 通过索引将新值写入对应行的Severity列 df.loc[idx, 'Severity'] = s
这种方法和你原来的循环思路一致,但需要注意:iterrows在数据量较大时效率较低,适合小数据集使用。
方案二:使用Pandas向量化操作(推荐)
Pandas的向量化操作比循环高效得多,适合大规模数据集,这里提供两种实现方式:
方式1:嵌套np.where
import numpy as np def severity_levels(df): df['Severity'] = np.where( df['CVSS'] >= 7.0, 'High', np.where( df['CVSS'] >= 4.0, 'Moderate', 'Low' ) )
方式2:pd.cut区间划分
如果需要更清晰的区间定义,可以用pd.cut:
def severity_levels(df): # 定义CVSS区间和对应的标签 bins = [-float('inf'), 4.0, 7.0, float('inf')] labels = ['Low', 'Moderate', 'High'] # 按区间划分并替换Severity列 df['Severity'] = pd.cut(df['CVSS'], bins=bins, labels=labels, include_lowest=True)
两种向量化方法都会直接覆盖原Severity列的所有值,无需手动循环,执行效率远高于逐行遍历。
内容的提问来源于stack exchange,提问作者Mitchell Privett
相关产品推荐
相关产品推荐

