You need to enable JavaScript to run this app. 如何解决Pandas DataFrame计算预测标签占比时P@1、P@3结果为0的问题
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Pandas DataFrame计算预测标签占比时P@1、P@3结果为0的问题

问题原因

核心问题是数据类型/格式不一致导致匹配判断失败:

  • 你对baseline三列的每个值都做了.strip()处理,说明baseline列的值为字符串类型,可能带有多余空格,处理后可以和manual_label匹配成功
  • 但你对label_1/2/3三列的值没有做任何标准化处理:
    1. 如果label列的值是带空格的字符串,未做strip处理会直接导致匹配失败
    2. 如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 15:03:04