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
相关产品推荐
相关产品推荐

