You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对比DataFrame返回预测结果:报错排查与解决方法

解决DataFrame按类别阈值筛选生成预测列表的问题

问题背景

现有两个DataFrame定义如下:

import pandas as pd

df1 = pd.DataFrame({
    'file_names': ['file_name1', 'file_name2', 'file_name3', 'file_name4'],
    'class1': [0.655, 0.5216, 0.1561, 0.5616],
    'class2': [0.5216, 0.0231, 0.516, 0.546],
    'class3': [0.2131, 0.516, 0.2165, 0.651],
    'class4': [0.65, 0.2165, 0.2165, 0.05616],
    'class5': [0.01265, 0.0516, 0.05, 0.0561]
})

df2 = pd.DataFrame({
    'class': ['class2', 'class3', 'class4', 'class1', 'class5'],
    'threshold': [0.2165, 0.5165, 0.79874, 0.216, 0.3546]
})

需求:为每个file_name筛选出满足df1对应类别列的值 ≥ df2中该类别阈值的类别,生成以逗号分隔的类别列表。

尝试两种方法均报错:

  • 第一种代码仅报错提示'class1'
  • 使用iterrows遍历行时,返回错误"Index 0 is out of bounds for axis 0 with size 0"

解决方案

推荐使用向量化操作实现,避免iterrows的低效和索引问题:

  1. 将df2转换为类别-阈值字典,实现快速阈值查找:
threshold_dict = df2.set_index('class')['threshold'].to_dict()
  1. 定义筛选函数并应用到每行:
def get_predictions(row):
    # 遍历所有类别列,筛选符合阈值条件的类别名称
    matched_classes = [col for col in row.index if col != 'file_names' and row[col] >= threshold_dict[col]]
    return ', '.join(matched_classes)

# 生成结果DataFrame
df_result = df1[['file_names']].copy()
df_result['predictions'] = df1.apply(get_predictions, axis=1)
  1. 查看最终结果:
print(df_result)

输出结果:

file_names    predictions
0  file_name1  class2, class4
1  file_name2             class1
2  file_name3  class2, class1
3  file_name4  class2, class3, class1

错误原因分析

  • 第一种方法报错'class1':大概率是直接按列顺序匹配df2的阈值,但df2的类别顺序与df1的列顺序不一致,导致阈值对应错误。
  • iterrows方法报错索引越界:通常是遍历过程中尝试访问空列表的索引(比如某行无符合条件的类别),或处理数据时索引逻辑混乱。

内容的提问来源于stack exchange,提问作者euler614

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:55:27