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

PyMongo聚合查询使用$avg函数返回NaN问题求助

解决PyMongo聚合中$avg返回NaN的问题

咱们来一步步拆解你遇到的问题,主要有两个核心点需要修正:

1. 错误的分组条件设置

你当前的聚合查询里,$group的_id写的是固定值{"movie_genre":"Drama"},这会把集合里所有文档都归到同一个组里,而不是按movie_genre字段的实际值进行分组。这不仅不符合你按类型计算平均评分的需求,还可能因为组内混入无效的movie_rank值,导致$avg返回NaN。

正确的分组方式应该引用字段值:

coll.aggregate([
    {"$group": {"_id": {"movie_genre": "$movie_genre"}, "avg_rank": {"$avg": "$movie_rank"}}}
])

2. 过滤无效的movie_rank数据

从你提供的文档示例来看,部分字段(比如actor_gender)的值是字符串'NaN',推测你的集合里可能存在一些文档的movie_rank不是有效的数值类型(比如是字符串'NaN',或者字段缺失)。MongoDB的$avg函数只要组内有一个无效数值,就会返回NaN。

建议在聚合前先过滤掉这些无效数据:

coll.aggregate([
    # 只保留movie_rank是数值且不为NaN的文档
    {"$match": {"movie_rank": {"$type": "double", "$ne": float("nan")}}},
    # 按movie_genre分组计算平均评分
    {"$group": {"_id": "$movie_genre", "avg_rank": {"$avg": "$movie_rank"}}}
])

如果你的需求只是计算Drama类型的平均评分,可以把过滤条件更精准:

coll.aggregate([
    {"$match": {
        "movie_genre": "Drama",
        "movie_rank": {"$type": "double", "$ne": float("nan")}
    }},
    {"$group": {"_id": "$movie_genre", "avg_rank": {"$avg": "$movie_rank"}}}
])

额外:验证数据类型

你也可以先检查集合里movie_rank字段的类型分布,确认是否有非数值的情况:

# 统计movie_rank的类型分布
coll.aggregate([
    {"$group": {"_id": {"$type": "$movie_rank"}, "count": {"$sum": 1}}}
])

如果结果里有string类型的条目,说明存在字符串格式的'NaN'或其他非数值,你可以选择批量清洗数据(比如将字符串'NaN'转为数值NaN),或者直接过滤掉这些文档。

比如批量更新字符串'NaN'为数值NaN:

coll.update_many(
    {"movie_rank": "NaN"},
    {"$set": {"movie_rank": float("nan")}}
)

内容的提问来源于stack exchange,提问作者Alfonso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:45