如何统计pandas数据集中Class列的类别频率用于熵离散化计算
问题修复方案
你代码的错误根源是:df = s['Class']取到的是一维Series对象,无法直接给Series新增freq列,导致统计逻辑报错。以下是两种正确实现统计Class列频率的方法:
方法1:使用value_counts()直接统计(最适合熵计算场景)
你已经调用了value_counts(),这个接口会直接返回每个类别的出现次数,除以总样本数即可得到概率,修改后的entropy函数如下:
def entropy(s): # 计算类别总数,会正确输出2 numberOfClasses = s['Class'].nunique() print(f'Number of classes: {numberOfClasses}') total_sample = len(s) # 拿到每个Class值的出现次数 class_count = s['Class'].value_counts() ent = 0.0 # 动态遍历所有类别计算熵 for cnt in class_count: p = cnt / total_sample ent -= p * log2(p) # 单独取类别1和类别2的概率 p1 = class_count.get(1, 0) / total_sample p2 = class_count.get(2, 0) / total_sample print(f'Class=1出现频率:{p1},Class=2出现频率:{p2}') return ent
方法2:修正你的groupby+transform写法
如果你需要保留原来的transform实现逻辑,应该在完整DataFrame上操作,而非单独取出的Class列:
# 给原DataFrame新增freq列,存储每行对应Class的总出现次数 s['freq'] = s.groupby('Class')['Class'].transform('count') # 去重后即可得到每个Class对应的总次数 print(s[['Class','freq']].drop_duplicates())
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

