如何编写if判断语句判定列表遍历完成,计算数据集分类列熵值
熵计算循环逻辑修正方案
问题根因
你当前代码的核心逻辑错误是:将熵值追加到结果列表的逻辑放在了内层频次遍历循环中,且判断条件完全不符合需求。你用c_data_copy[l] == c_data_copy[len(c_data_copy) - 1]作为触发追加的条件,本质是判断「当前遍历到的频次值等于该列最后一个类别的频次值」,只要遍历过程中碰到和最后一个频次相等的数值(哪怕还没遍历完所有类别),就会提前把未计算完成的熵值加入列表,自然无法得到正确的全列熵结果。
修正逻辑
不需要额外的if判断,直接把熵值追加的逻辑移到内层频次遍历循环外部即可:内层循环走完就代表该列的所有类别频次都计算完成,此时的entropy就是该列的最终熵值,直接追加到结果列表即可。
修正后代码
import math entropy_list =[] # 提前定义数据集总行数,保证概率计算分母正确,如已定义可删除该行 row = len(avustralya_hava_data) # 筛选分类列逻辑保持不变 categorical_data = [x for x in avustralya_hava_data.columns if avustralya_hava_data[x].dtypes == "O"] for col in avustralya_hava_data[categorical_data].columns: c_data_copy = avustralya_hava_data[col].value_counts() print(c_data_copy, "\n") print("******************") entropy = 0 # 遍历当前列所有类别计算熵值 for l in range(len(c_data_copy)): p = (c_data_copy[l]/row) entropy += (-math.log(p,2)*(p)) print(c_data_copy[l]," degeri icin entropi ","--->",entropy) # 内层循环结束,当前列熵计算完成,直接追加结果 entropy_list.append(entropy) print("\n","Entropi list :" ,entropy_list, "\n") print("******************")
修改说明
- 新增总行数计算逻辑,避免概率计算分母未定义的问题,如你之前已经定义过
row变量可直接删除该行 - 移除了错误的if判断逻辑,将结果追加操作放在内层循环结束后,保证只有全列熵计算完成后才会写入结果列表
- 循环变量
i重命名为col提升代码可读性,你可根据自己的习惯保留原名
内容的提问来源于stack exchange,提问作者Ege Pancaroğlu
相关产品推荐
相关产品推荐

