Pandas是否有类似Excel排除式SUMIF的功能?用于混淆矩阵准确率计算
Pandas实现混淆矩阵的分类正确占比(替代Excel SUMIF排除式求和)
你要实现的是混淆矩阵中每列的正确分类占比,对应Excel公式的逻辑是**(列总和 - 列中行标签与列名不匹配的数值之和) / 列总和**,本质就是取列中「行索引=列名」的正确分类数,除以该列的总样本数。在Pandas里可以更直接地实现,具体步骤如下:
1. 准备数据(读取或构造混淆矩阵)
假设你的Excel数据读取后,行索引是分类名称(如Fantasy、Horror、RPG),列也是对应的分类。可以这样构造或处理数据:
import pandas as pd # 方法1:构造示例混淆矩阵(模拟Excel中的表格) data = { 'Fantasy': [25, 1, 11], 'Horror': [3, 13, 1], 'RPG': [1, 0, 7] } my_data = pd.DataFrame(data, index=['Fantasy', 'Horror', 'RPG']) # 方法2:从Excel读取并设置行索引(如果你的Excel第一列是分类名称) # my_data = pd.read_excel("c:/mydata.xlsx", index_col=0)
2. 计算正确分类占比
方法1:利用numpy提取对角线(最简洁)
混淆矩阵的对角线元素就是各分类的正确预测数,直接提取后除以列总和即可:
import numpy as np # 提取对角线元素(正确分类数) correct_counts = np.diag(my_data) # 计算每列的总样本数 column_totals = my_data.sum(axis=0) # 计算占比并保留两位小数 accuracy = (correct_counts / column_totals).round(2)
执行结果:
Fantasy 0.68 Horror 0.76 RPG 0.88 dtype: float64
方法2:纯Pandas实现(无需numpy)
通过遍历列名,取对应行索引的数值:
# 提取每列中「行索引=列名」的正确分类数 correct_counts = my_data.apply(lambda col: col[col.name], axis=0) # 计算列总和 column_totals = my_data.sum(axis=0) # 计算占比 accuracy = (correct_counts / column_totals).round(2)
补充说明
你提到的groupby确实不适合这个场景,因为混淆矩阵本身已经是分类的交叉统计结果,直接针对对角线和列总和计算即可,比Excel的SUMIF排除式求和更高效直观。
内容的提问来源于stack exchange,提问作者linkey apiacess
相关产品推荐
相关产品推荐

