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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:07