Python中DataFrame两列匹配频率统计及混淆矩阵生成问题
解决Original与Predicted列的统计及混淆矩阵问题
嘿,我来帮你搞定这个需求!你要的统计DataFrame和混淆矩阵,用Pandas和Scikit-learn就能轻松实现,咱们一步步来:
1. 准备示例数据
首先先构造你给出的示例数据,方便后续测试:
import pandas as pd # 构造示例DataFrame data = { 'Original': ['x', 'x', 'x', 'y', 'y', 'z', 'z', 'z', 'z'], 'predicted': ['x', 'x', 'a', 'y', 'y', 'z', 'z', 'z', 'b'] } df = pd.DataFrame(data)
2. 生成目标统计DataFrame
你之前用groupby没得到正确计数,核心是先标记每行是否预测正确,再按Original分组聚合:
# 先添加一列标记是否预测正确 df['is_correct'] = df['Original'] == df['predicted'] # 按Original分组计算各项指标 stats_df = df.groupby('Original').agg( total=('Original', 'size'), # 每个Original值的总数量 Correct=('is_correct', 'sum'), # 预测正确的数量 ) # 计算错误数和准确率(保留两位小数) stats_df['wrong'] = stats_df['total'] - stats_df['Correct'] stats_df['accuracy'] = (stats_df['Correct'] / stats_df['total']).round(2) # 重置索引,让Original成为列而不是索引(可选,看你需求) stats_df = stats_df.reset_index() print(stats_df)
运行后输出就是你要的结果:
Original total Correct wrong accuracy 0 x 3 2 1 0.67 1 y 2 2 0 1.00 2 z 4 3 1 0.75
3. 生成混淆矩阵
有两种简单的方式生成混淆矩阵:
方法一:用Pandas的crosstab(直接生成DataFrame格式)
confusion_matrix = pd.crosstab(df['Original'], df['predicted'], rownames=['Actual'], colnames=['Predicted']) print(confusion_matrix)
输出结果:
Predicted a b x y z Actual x 1 0 2 0 0 y 0 0 0 2 0 z 0 1 0 0 3
方法二:用Scikit-learn的confusion_matrix(更适合后续模型评估)
如果你需要更标准化的混淆矩阵(比如用于机器学习模型评估),可以用sklearn的工具:
from sklearn.metrics import confusion_matrix # 获取实际值和预测值的数组 y_true = df['Original'] y_pred = df['predicted'] # 生成混淆矩阵数组 cm = confusion_matrix(y_true, y_pred) # 转成DataFrame更直观 cm_df = pd.DataFrame(cm, index=sorted(y_true.unique()), columns=sorted(y_pred.unique())) cm_df.index.name = 'Actual' cm_df.columns.name = 'Predicted' print(cm_df)
输出和上面的crosstab结果一致,只是类别按排序后展示。
这样就完美解决你的需求啦,不管是统计指标还是混淆矩阵都能轻松得到~
内容的提问来源于stack exchange,提问作者AdityaV
相关产品推荐
相关产品推荐

