Python实现按ID分组计算元组第二个元素平均值并生成新列表
解决方案:按ID分组计算Rating平均值
嘿,作为Python新手碰到这种数据聚合的问题很正常,我给你几个实用的实现方法,一步步来搞定它!
思路说明
我们需要先把相同ID的所有Rating值归为一组,然后计算每组的平均值,最后把结果转换成你需要的元组列表格式。用字典来做分组是最直观高效的方式,下面是几种具体实现:
方法1:基础字典分组(适合新手理解)
这种方法逻辑最清晰,一步步拆分操作,容易跟着理解:
# 假设你的原始数据示例 norm_rating = [(7, 80), (7, 70), (7, 70), (34, 60), (36, 65), (36, 65)] # 第一步:用字典存储每个ID对应的所有Rating id_ratings = {} for id_num, rating in norm_rating: # 如果ID不在字典里,先初始化一个空列表 if id_num not in id_ratings: id_ratings[id_num] = [] # 把当前Rating添加到对应ID的列表中 id_ratings[id_num].append(rating) # 第二步:计算每个ID的平均值,生成目标列表 result = [] for id_num, ratings in id_ratings.items(): avg_rating = sum(ratings) / len(ratings) # 用round()控制小数位数,和示例输出的格式匹配 result.append((id_num, round(avg_rating, 1))) print(result) # 输出:[(7, 73.3), (34, 60.0), (36, 65.0)]
方法2:用collections.defaultdict简化代码
如果不想每次判断ID是否在字典里,可以用Python标准库的defaultdict来自动初始化列表,代码更简洁:
from collections import defaultdict norm_rating = [(7, 80), (7, 70), (7, 70), (34, 60), (36, 65), (36, 65)] # 自动为新ID创建空列表 id_ratings = defaultdict(list) for id_num, rating in norm_rating: id_ratings[id_num].append(rating) # 用列表推导式快速生成结果 result = [(id_num, round(sum(ratings)/len(ratings), 1)) for id_num, ratings in id_ratings.items()] print(result)
方法3:高效统计(适合大数据量)
如果你的数据量很大,不想存储所有Rating值(节省内存),可以直接统计每个ID的Rating总和和出现次数,再计算平均值:
norm_rating = [(7, 80), (7, 70), (7, 70), (34, 60), (36, 65), (36, 65)] # 字典存储每个ID的(total_rating, count) id_stats = {} for id_num, rating in norm_rating: if id_num in id_stats: total, count = id_stats[id_num] id_stats[id_num] = (total + rating, count + 1) else: # 第一次出现该ID,总和就是当前rating,计数为1 id_stats[id_num] = (rating, 1) # 计算平均值并生成结果 result = [(id_num, round(total/count, 1)) for id_num, (total, count) in id_stats.items()] print(result)
注意点
- 如果不需要保留一位小数,可以去掉
round(avg_rating, 1),直接用avg_rating即可 - 示例中的原始数据是根据你的输出反推的,你只需要把自己的
norm_rating变量替换进去就行
内容的提问来源于stack exchange,提问作者King Awan
相关产品推荐
相关产品推荐

