Python中如何对DataFrame指定列每行调用自定义预测函数并输出全量结果
问题原因
getPositivity函数返回的是形状为(1,1)的二维numpy数组(即[[0.xxx]]格式),直接赋值给DataFrame列时,pandas无法正常解析嵌套数组结构,大概率会出现整列被最后一次计算值覆盖的问题。- 逐行调用
model.predict的执行方式效率极低,也可能因为TensorFlow/Keras的预测缓存机制导致结果异常。
解决方案
推荐使用批量预测方案,性能更稳定、执行速度更快:
方案1:批量预测(推荐)
一次性处理所有文本,避免逐行调用预测接口,代码如下:
# 1. 批量转换所有文本为模型输入格式 input_seqs = tokenizer.texts_to_sequences(df_ticker['text'].tolist()) padded_inputs = pad_sequences(input_seqs, maxlen=maxlen) # 2. 批量预测所有结果 all_preds = model.predict(padded_inputs, verbose=0) # 3. 把二维预测结果展平为一维数组,赋值给DataFrame df_ticker['prediction'] = all_preds.flatten() # 4. 输出CSV,可选择重置索引避免保留原始的3/4/5序号 df_ticker = df_ticker.reset_index(drop=True) df_ticker.to_csv('NLP_ML.csv', index=False)
方案2:修改预测函数适配逐行调用
如果一定要用apply逐行调用,只需要修改getPositivity函数,直接返回浮点数标量即可:
def getPositivity(my_text): seq = tokenizer.texts_to_sequences([my_text]) seq = pad_sequences(seq, maxlen=maxlen) prediction = model.predict(seq, verbose=0) # 提取二维数组内的实际得分,转成普通浮点数 return float(prediction[0][0]) # 后续apply逻辑保持不变 df_ticker['prediction'] = df_ticker['text'].apply(lambda text:getPositivity(text)) df_ticker.to_csv('NLP_ML.csv', index=False)
内容的提问来源于stack exchange,提问作者YanRemes
相关产品推荐
相关产品推荐

