You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python浮点数比较问题:pandas按CVSS分值分类赋值全为3如何解决

问题原因

你遇到的问题和Python浮点数比较逻辑无关,是pandas列赋值逻辑错误导致的:你在循环中每次执行data["Class Number"] = xx时,都是直接给整个Class Number列的所有行统一赋值,循环结束时会以最后一行的score=7.8的判断结果为准,因此整列都被覆盖为3。

正确实现方案

方案1:使用pandas的cut分箱(推荐,性能更高,无需循环)

pd.cut是专门用来做区间分箱的方法,刚好匹配你的区间赋值需求:

import pandas as pd

data = pd.read_csv('tag_SA.txt', sep='|')
# 定义区间边界和对应赋值,right=False表示区间左闭右开,完全匹配你的规则
bins = [0, 6, 7.5, 10]
labels = [1, 2, 3]
data['Class Number'] = pd.cut(data['CVSS Score'], bins=bins, labels=labels, right=False)
# 若需要转为整数类型可加下面这句
data['Class Number'] = data['Class Number'].astype(int)

方案2:逐行循环赋值(匹配你原本的写法思路)

如果要保留循环写法,需要按索引逐行赋值,不能直接覆盖整列:

import pandas as pd

data = pd.read_csv('tag_SA.txt', sep='|')
# 先初始化目标列
data['Class Number'] = 0
for idx, score in enumerate(data['CVSS Score']):
    if 0 <= score < 6:
        data.loc[idx, 'Class Number'] = 1
    elif 6 <= score < 7.5:
        data.loc[idx, 'Class Number'] = 2
    else:
        data.loc[idx, 'Class Number'] = 3
浮点数比较的注意事项

你当前场景下CVSS分数都是明确到小数点后1位的固定值,不会出现浮点精度误差问题。如果是其他存在浮点计算的场景,要注意浮点数的二进制存储可能存在精度偏差,比如计算得到的6.0可能实际存储为5.999999999999999或者6.000000000000001,这种情况可以用math.isclose做近似判断,避免逻辑错误。

内容的提问来源于stack exchange,提问作者gmorton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:15:01