Pandas DataFrame中MSE函数返回NaN值问题排查
问题原因
报错核心是数据类型不匹配导致筛选结果为空:
你的product_id列是整数类型,但在df.query()筛选逻辑中,给匹配值game_id额外加了单引号,相当于用字符串格式的id去匹配整数类型的列,最终每一轮循环筛选得到的pred_g都是空DataFrame。空数组做均值计算会返回NaN,传入sklearn的MSE函数就会触发「0样本」的报错。
你可以在原有循环中加一行打印筛选行数的代码验证,会看到每轮输出的行数都是0:
for game_id in df['product_id'].unique(): pred_g = df.query(f"product_id == '{game_id}'") print(len(pred_g)) # 输出0,验证筛选结果为空
修复方法
方法1:修正query语句的类型匹配
去掉{game_id}外层的单引号,让匹配值和列的整数类型保持一致即可:
for game_id in df['product_id'].unique(): pred_g = df.query(f"product_id == {game_id}") print(game_id, " MSE = ", mse(pred_g["real"], pred_g["pred"]))
运行后输出结果:
20 MSE = 0.212 22 MSE = 0.452
注意:你原代码打印文案写的是MAE,实际计算的是MSE,属于笔误,记得修正文案避免混淆。
方法2:用pandas原生分组逻辑(推荐)
不需要手写循环遍历唯一值,直接用groupby配合自定义函数计算,代码更简洁,也不容易出现类型匹配类的低级错误:
import pandas as pd import numpy as np df = pd.DataFrame({'product_id' : [20,20,20,20,20,22,22,22,22,22], 'date' : ['2020-06','2020-07','2020-08','2020-09', '2020-10','2020-06','2020-07','2020-08','2020-09', '2020-10'],'real': [1.2,3,4,5,1,1.5,2.9,5,6,1], 'pred': [1.3,4,4,5.1,1.2,1.5,3,6,5,1.5]}) def mse(actual, predicted): actual = np.array(actual) predicted = np.array(predicted) differences = np.subtract(actual, predicted) squared_differences = np.square(differences) return squared_differences.mean() # 分组直接计算MSE mse_result = df.groupby('product_id').apply(lambda x: mse(x['real'], x['pred'])) print(mse_result)
内容的提问来源于stack exchange,提问作者MatmataHi
相关产品推荐
相关产品推荐

