Python计算数据集特征熵时如何避免重复打印历史数据
问题分析
你代码输出累加列表的核心原因是全局变量entropy_list的错误使用:你没有在entropy_calculate函数内部初始化这个列表,而是复用了外部定义的全局列表,每次调用函数都会把新计算的熵值追加到同一个列表中,因此返回的结果会不断累加之前所有的计算值。
修复方案
修改entropy_calculate函数,每次调用时都在内部初始化新的列表,仅返回当前计算得到的单元素熵值列表即可:
import math def entropy_calculate(dataframe, column_name): """ 功能:计算指定列的熵值 参数: dataframe (pd.DataFrame): 输入数据集 column_name (str): 目标列名称 异常: 输入列非object类型时抛出异常 返回: list: 仅包含当前计算熵值的单元素列表 """ entropy_list = [] # 每次调用都初始化全新列表,不要使用全局变量 if dataframe[column_name].dtypes == "O": c_data_copy = dataframe[column_name].value_counts() entropy = 0 len_of_cdata = len(c_data_copy) for i in range(len_of_cdata): p_of_val = c_data_copy[i] / dataframe.shape[0] entropy += -(math.log(p_of_val, 2) * p_of_val) entropy_list.append(entropy) else: raise Exception("仅支持计算分类类型数据的熵值。") return entropy_list
修改后你的原有循环逻辑可以直接正常运行,输出每个特征唯一值对应的独立单元素熵列表。
优化实现方案
你可以用pandas分组逻辑简化代码,避免多层循环嵌套,同时提升运行效率:
import pandas as pd import math # 定义熵计算工具函数,直接返回数值型熵结果 def calc_entropy(series): prob = series.value_counts(normalize=True) return -sum(p * math.log(p, 2) for p in prob) # 遍历每个分类特征,输出结果 for feature in categorical_data[:-1]: print(feature) # 按当前特征分组,直接计算每组RainTomorrow的熵 for entropy_val in avustralya_hava_data.groupby(feature)['RainTomorrow'].apply(calc_entropy): print([entropy_val])
内容的提问来源于stack exchange,提问作者Ege Pancaroğlu
相关产品推荐
相关产品推荐

