批量处理DataFrame并多模型评分后合并的问题求助
问题分析与解决方案
错误原因
你当前的代码逻辑存在两个核心问题:
- 数据拼接逻辑错误:每个模型处理所有数据批后,会生成仅含该模型评分列的DataFrame,最后按行拼接导致同一行数据重复N次(N为模型数量),每行仅对应模型的评分有值。
- 违反内存约束:一次性读取全量百万行数据到
full_df,不符合"无法一次性加载全量数据到内存"的要求。
修改思路
- 用分块读取CSV替代全量加载,避免内存溢出;
- 一次性加载所有模型(满足仅加载一次的要求);
- 对每个数据块(100行),直接追加所有模型的评分列,而非生成多个独立DataFrame;
- 处理完的块可直接追加到输出文件,无需全量存于内存。
修改后的代码
import pandas as pd # 配置参数 batch_size = 100 output_file = 'target_df.csv' list_of_models = [model1, model2, model3] # 替换为你的实际模型列表 # 1. 一次性加载所有模型(仅执行一次) loaded_models = [] for idx, model in enumerate(list_of_models, 1): model.load() # 绑定评分列名与对应模型 loaded_models.append((f'score_{idx}', model)) # 2. 分块读取原始数据,逐块处理并保存 first_write = True # 用chunksize分块读取,避免全量加载内存 for chunk in pd.read_csv('fulldf.csv', chunksize=batch_size): # 为当前块添加所有模型的评分列 for col_name, model in loaded_models: # 替换为你的实际评分生成逻辑 scores = model.predict(chunk['text'].tolist()) chunk[col_name] = scores # 将处理好的块追加到输出文件 chunk.to_csv( output_file, mode='a', header=first_write, index=False ) first_write = False # 后续块不再写入表头 # 若内存允许,可读取生成的文件得到完整DataFrame # total_df = pd.read_csv(output_file)
备选方案(内存允许时)
如果必须在内存中暂存所有数据批,可调整为以下逻辑(仍优先推荐分块写入方案):
import pandas as pd batch_size = 100 list_of_models = [model1, model2, model3] df_batches = [] # 分块读取数据到内存(仅适合内存可容纳的场景) for chunk in pd.read_csv('fulldf.csv', chunksize=batch_size): df_batches.append(chunk.copy()) # 加载所有模型 loaded_models = [] for idx, model in enumerate(list_of_models, 1): model.load() loaded_models.append((f'score_{idx}', model)) # 为每个批添加所有评分列 processed_batches = [] for batch in df_batches: for col_name, model in loaded_models: scores = model.predict(batch['text'].tolist()) batch[col_name] = scores processed_batches.append(batch) # 合并所有批得到目标DataFrame total_df = pd.concat(processed_batches, ignore_index=True) total_df.to_csv('target_df.csv', index=False)
关键逻辑说明
- 模型仅在初始化阶段加载一次,全程复用;
- 每个数据块一次性添加所有模型的评分列,避免行重复;
- 分块读取从根源解决全量内存加载的问题;
- 最终输出的DataFrame每行仅保留一次,包含所有模型的评分列。
内容的提问来源于stack exchange,提问作者codingray
相关产品推荐
相关产品推荐

