如何对Pandas DataFrame的不同行批量应用对应模型完成一次性预测?
如何对Pandas DataFrame的不同行批量应用对应模型完成一次性预测?
嘿,我完全懂你不想拆分数据集分别预测的诉求,这里有两种简洁的「一步到位」方法,能直接根据model_version列匹配对应模型完成预测,不用手动拆分再合并:
方法一:用apply结合模型映射字典
首先我们把模型和对应的版本名做成一个映射字典,然后通过apply逐行调用对应模型预测:
# 先创建模型与版本的映射字典 model_map = {'model_a': model_a, 'model_b': model_b} # 定义特征列(排除id和model_version) feature_cols = df.columns.difference(['id', 'model_version']) # 一次性生成预测结果 df['predictions'] = df.apply( lambda row: model_map[row['model_version']].predict( row[feature_cols].values.reshape(1, -1) )[0], # 取单样本预测结果的第一个元素 axis=1 )
解释:
- 映射字典
model_map帮我们快速根据model_version的值找到对应的模型 row[feature_cols].values.reshape(1, -1)是把单行特征转成模型predict方法需要的二维数组格式apply会自动遍历每一行,把预测结果直接赋值给新的predictions列,全程不用拆分DataFrame
方法二:用groupby+transform批量处理
如果你的同版本数据量比较大,分组处理会更高效,transform会自动把分组预测的结果对齐回原DataFrame:
model_map = {'model_a': model_a, 'model_b': model_b} feature_cols = df.columns.difference(['id', 'model_version']) df['predictions'] = df.groupby('model_version').transform( lambda group: model_map[group.name].predict(group[feature_cols]) )
解释:
- 按
model_version分组后,每个组的group.name就是对应的版本名,直接从字典里取模型 - 对整个组批量预测,比逐行
apply效率更高(尤其是数据量大的时候) transform会自动将分组预测的结果按原DataFrame的索引位置填充,完美对齐原数据
这两种方法都完全符合你要的「one-go」需求,不用拆分数据集,一步就能生成所有预测结果~
备注:内容来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

