Python不借助Pandas/Numpy遍历CSV行按多维度求最高金额供应商方法
实现思路
用两层字典存储中间数据是最直观的方案,逻辑并不复杂,你原有代码的问题主要是分支判断不全、语法错误、未处理表头导致的。整体只需要两步:
- 遍历CSV行跳过表头,累加每个
(Unit, Period)分组下每个供应商的总金额 - 遍历每个
(Unit, Period)分组,筛选出组内总金额最高的供应商输出即可
修正后可运行代码
# 测试CSV数据 cv = "Unit,SupplierID,ReceivedPeriod,Amount/n5400,0213123,6,3450.87/n5400,0521332,6,5902.21/n5400,0213123,6,4506.46/n6300,0293899,7,9801.10/n6300,0381923,7,6203.76" lines = cv.split("/n") # 第一层key为(Unit, Period)元组,第二层key为SupplierID,value为累计金额 sum_data = {} for index, line in enumerate(lines): # 跳过表头行 if index == 0: continue unit, supplier_id, period, amount = line.split(",") # 组合分组key,用元组比拼接字符串更方便后续处理 group_key = (unit, period) # 分组不存在则初始化 if group_key not in sum_data: sum_data[group_key] = {} # 供应商不存在则初始化金额 if supplier_id not in sum_data[group_key]: sum_data[group_key][supplier_id] = 0.0 # 累加金额,保留两位小数 sum_data[group_key][supplier_id] = round(sum_data[group_key][supplier_id] + float(amount), 2) # 遍历分组取最高金额 for (unit, period), supplier_amount in sum_data.items(): # 按金额排序取最大值 max_supplier, max_amount = max(supplier_amount.items(), key=lambda x: x[1]) # 按要求格式输出 print(f"{unit},{period} - {max_amount:.2f}")
输出结果
5400,6 - 7957.33 6300,7 - 9801.10
完全匹配预期输出要求。
内容的提问来源于stack exchange,提问作者Blake Daniel
相关产品推荐
相关产品推荐

