如何解决Pandas DataFrame计算预测标签占比时P@1、P@3结果为0的问题
问题原因
核心问题是数据类型/格式不一致导致匹配判断失败:
- 你对
baseline三列的每个值都做了.strip()处理,说明baseline列的值为字符串类型,可能带有多余空格,处理后可以和manual_label匹配成功 - 但你对
label_1/2/3三列的值没有做任何标准化处理:- 如果label列的值是带空格的字符串,未做strip处理会直接导致匹配失败
- 如果label列是字符串类型、
manual_label是整数类型,类型不一致也会导致==和in判断全部返回False
- 你代码中写的
for j in range(len(predictions)): predictions[j]=predictions[j]属于无效代码,没有做任何实际处理。
解决方法
快速修复现有循环代码
给predictions列也做和baseline一致的标准化处理,统一类型和格式即可:
baseline_p1=0 baseline_p3=0 pred_p1=0 pred_p3=0 rows=final.shape[0] # 先统一标签列的类型和格式 final['manual_label'] = final['manual_label'].astype(str).str.strip() for i in range(rows): gold = final.iloc[i]["manual_label"] # 标准化baseline数据 baseline=[final.iloc[i]["baseline_1"], final.iloc[i]["baseline_2"],final.iloc[i]["baseline_3"]] baseline = [str(x).strip() for x in baseline] # 新增predictions的标准化处理,和baseline逻辑一致 predictions=[final.iloc[i]["label_1"], final.iloc[i]["label_2"],final.iloc[i]["label_3"]] predictions = [str(x).strip() for x in predictions] if gold == baseline[0]: baseline_p1+=1 if gold in baseline: baseline_p3+=1 if gold == predictions[0]: pred_p1+=1 if gold in predictions: pred_p3+=1 # 原有print写法格式化有误,改为f-string输出更清晰 print(f"Raw counts: B@1={baseline_p1} B@3={baseline_p3} P@1={pred_p1} P@3={pred_p3}") print(f"Percentages: B@1={baseline_p1/rows:.2%} B@3={baseline_p3/rows:.2%} P@1={pred_p1/rows:.2%} P@3={pred_p3/rows:.2%}")
更高效的Pandas向量化实现(避免循环,性能更高)
# 统一所有相关列的类型和格式 cols = ['manual_label', 'baseline_1', 'baseline_2', 'baseline_3', 'label_1', 'label_2', 'label_3'] final[cols] = final[cols].astype(str).apply(lambda x: x.str.strip()) # 直接向量化计算各个指标 b1 = (final['manual_label'] == final['baseline_1']).mean() b3 = final.apply(lambda x: x['manual_label'] in [x['baseline_1'], x['baseline_2'], x['baseline_3']], axis=1).mean() p1 = (final['manual_label'] == final['label_1']).mean() p3 = final.apply(lambda x: x['manual_label'] in [x['label_1'], x['label_2'], x['label_3']], axis=1).mean() print(f"Percentages: B@1={b1:.2%} B@3={b3:.2%} P@1={p1:.2%} P@3={p3:.2%}")
内容的提问来源于stack exchange,提问作者Pelide
相关产品推荐
相关产品推荐

