不使用pandas/numpy等库 如何按genre分组计算平均销售额
纯Python实现按 genre 分组计算平均销售额的思路
前置假设
你从数据库读取到的原始数据为Python原生的列表套字典结构,这也是Python读取关系型数据最常用的原生返回格式,单条数据示例如下:
{"genre": "Action", "sales": 123.4, "其他字段": "xxx"}
如果是列表套元组等其他结构,修改对应字段的取值逻辑即可。
实现步骤
- 第一步:初始化两个辅助字典,分别存储每个genre的累计销售额、累计记录数
- 第二步:遍历全量数据,完成两个字典的数值累加:
- 遇到未出现过的genre时,先给两个字典对应key初始化值为0
- 累加当前记录的销售额到对应genre的总销售额字段
- 对应genre的记录数+1
- 第三步:遍历辅助字典,用
单genre总销售额 / 单genre记录数计算得到对应平均销售额,生成结果字典 - 可选优化:如果数据存在空销售额、零记录等异常情况,提前加过滤逻辑避免计算错误
代码示例
# 示例原始数据,可替换为你从数据库读取的实际数据 raw_data = [ {"genre": "Action", "sales": 120.5}, {"genre": "Adventure", "sales": 99.2}, {"genre": "Action", "sales": 150.7}, {"genre": "RPG", "sales": 210.3}, {"genre": "Adventure", "sales": 85.6}, {"genre": "RPG", "sales": 198.9} ] # 初始化辅助字典 genre_total_sales = {} genre_count = {} # 遍历完成累加 for item in raw_data: current_genre = item["genre"] current_sales = item["sales"] # 新增分类初始化 if current_genre not in genre_total_sales: genre_total_sales[current_genre] = 0 genre_count[current_genre] = 0 # 数值累加 genre_total_sales[current_genre] += current_sales genre_count[current_genre] += 1 # 计算平均销售额 genre_avg_sales = {} for genre in genre_total_sales: # 避免除零错误 if genre_count[genre] > 0: # 保留2位小数,可按需修改精度 genre_avg_sales[genre] = round(genre_total_sales[genre] / genre_count[genre], 2) # 输出结果和pandas groupby的计算结果完全一致 print(genre_avg_sales) # 示例输出:{'Action': 135.6, 'Adventure': 92.4, 'RPG': 204.6}
扩展说明
如果你的原始数据是从数据库cursor.fetchall()读取的列表套元组结构,只需要把取值逻辑换成下标取值即可,比如current_genre = item[1]、current_sales = item[3],对应你数据库表的字段顺序调整即可。
内容的提问来源于stack exchange,提问作者Claudine Donnellan
相关产品推荐
相关产品推荐

