如何筛选DataFrame中class与pred列不匹配的记录?
解决方案
一、直接筛选class与pred不匹配的记录
最直接的方式是利用布尔索引过滤出两列值不相等的行:
# 筛选不匹配的记录 mismatched_df = df[df['class'] != df['pred']]
如果习惯用query方法,也可以这样写:
mismatched_df = df.query('class != pred')
注意:如果
class和pred的数据类型不一致(比如一个是字符串、一个是整数),需要先统一类型,例如执行df['class'] = df['class'].astype(int)后再进行比较。
二、优化预测列(pred)的生成逻辑
你原来的pred生成代码可以简化,避免冗余操作:
方案1:简化中间列生成
利用filter(like=xxx)直接筛选对应类别的概率列,再计算最大值:
import pandas as pd # 分别计算每个类别在所有模型中的最大概率 df['Covid_max'] = df.filter(like='Covid').max(axis=1) df['Normal_max'] = df.filter(like='Normal').max(axis=1) df['Pneumonia_max'] = df.filter(like='Pneumonia').max(axis=1) # 生成pred并映射标签 label_map = {'Covid_max': 0, 'Normal_max': 1, 'Pneumonia_max': 2} df['pred'] = df[['Covid_max','Normal_max','Pneumonia_max']].idxmax(axis=1).map(label_map)
方案2:无需生成中间列(更高效)
直接按类别分组计算最大概率,一步生成pred:
import pandas as pd # 按类别分组计算每个样本的最大概率 category_probs = pd.DataFrame({ 'Covid': df.filter(like='Covid').max(axis=1), 'Normal': df.filter(like='Normal').max(axis=1), 'Pneumonia': df.filter(like='Pneumonia').max(axis=1) }) # 生成pred并映射标签 df['pred'] = category_probs.idxmax(axis=1).map({'Covid': 0, 'Normal': 1, 'Pneumonia': 2})
这种方式省去了中间的Covid_max等列,代码更紧凑,内存占用也更低。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

