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
相关产品推荐
相关产品推荐

