我有一个如下所示的数据框。
Category Actual Predicted
1 1 1
1 0 1
1 0 0
1 0 0
2 1 1
2 1 0
2 0 0
2 0 1
3 1 1
3 0 1
3 0 0
3 0 1
根据以上内容,我想计算出每个类别1、2和3的召回率,如下所示。
预期输出:
Category Recall_for Recall
1 0 66.7
1 1 100
2 0 50
2 1 50
3 0 33.3
3 1 100
说明:
对于类别= 1,实际= 1,有1种情况为真(与“预测”匹配),因此召回率= 1/1 * 100 = 100
对于类别= 1,实际= 0,有3种情况,只有2种为真(与Predicted相匹配),因此召回= 2/3 * 100 = 66.7,依此类推。
答案 0 :(得分:2)
将两个列都与Series.eq
进行比较,通过DataFrame.assign
设置新列,然后聚合mean
(True
的处理方式与1
相似)并且最后多个和必要时取整值:
s = df['Predicted'].eq(df['Actual'])
df = (df.assign(Recall=s)
.groupby(['Category','Actual'])['Recall']
.mean()
.mul(100)
.round(1)
.reset_index()
.rename(columns={'Actual':'Recall_for'}))
print (df)
Category Recall_for Recall
0 1 0 66.7
1 1 1 100.0
2 2 0 50.0
3 2 1 50.0
4 3 0 33.3
5 3 1 100.0