You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:45:51