对比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的低效和索引问题:
- 将df2转换为类别-阈值字典,实现快速阈值查找:
threshold_dict = df2.set_index('class')['threshold'].to_dict()
- 定义筛选函数并应用到每行:
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)
- 查看最终结果:
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
相关产品推荐
相关产品推荐

