Python Pandas提取Azure成本导出CSV标签值并汇总成本
Azure成本CSV标签汇总处理方案
针对2.5GB/290万行的大文件场景,采用分块读取+逐块聚合的方式实现,避免全量加载导致的内存溢出,完全匹配需求规则。
原有初始代码问题说明
- 直接全量读取整个CSV文件,内存占用过高,普通配置机器容易触发OOM崩溃
subsdata = bill(...)语法错误,DataFrame对象不能直接作为函数调用CostInBillingCurrency是金额计算字段,读取为字符串类型无法直接做求和运算
核心处理逻辑
- 读取阶段只加载
Tags、CostInBillingCurrency两个必需字段,减少无效内存占用 - 按固定行粒度分块读取处理,每块单独完成标签提取、金额清洗、分组聚合,最后合并所有块的聚合结果得到最终值
- 预编译正则表达式匹配
Azure-CostCenter标签,自动兼容键值对前后空格,提取标签值后自动去除首尾多余空格 - 未匹配到目标标签、Tags字段为空的行,统一归入
N/A分组 - 金额字段自动做类型转换,异常空值/非数值按0处理,避免运行中断
完整实现代码
import pandas as pd import re # 可根据本机内存调整分块大小,内存越小数值调得越小 CHUNK_SIZE = 100000 INPUT_PATH = "Costs.csv" OUTPUT_PATH = "consolidation.csv" TARGET_TAG = "Azure-CostCenter" # 预编译正则提升匹配效率,兼容Azure导出的标签键值对格式 tag_match_pattern = re.compile(rf'"{TARGET_TAG}"\s*:\s*"([^"]*)"') total_cost_summary = pd.Series(dtype="float64") # 分块迭代读取文件 for data_chunk in pd.read_csv( INPUT_PATH, usecols=["Tags", "CostInBillingCurrency"], chunksize=CHUNK_SIZE, low_memory=False ): # 清洗金额字段:转数值类型,异常值填充为0 data_chunk["CostInBillingCurrency"] = pd.to_numeric( data_chunk["CostInBillingCurrency"], errors="coerce" ).fillna(0) # 提取目标标签值 def get_target_tag_value(tag_content): if pd.isna(tag_content): return "N/A" match_res = tag_match_pattern.search(str(tag_content)) if not match_res: return "N/A" return match_res.group(1).strip() data_chunk["tag_value"] = data_chunk["Tags"].apply(get_target_tag_value) # 当前块聚合 chunk_summary = data_chunk.groupby("tag_value")["CostInBillingCurrency"].sum() # 合并到总汇总结果 total_cost_summary = total_cost_summary.add(chunk_summary, fill_value=0) # 整理结果格式,匹配导出框架要求 result = total_cost_summary.rename_axis(TARGET_TAG).rename("TotalCost") # 按给定框架导出 result.to_csv(OUTPUT_PATH, index=True)
运行说明
- 机器内存为16G时,
CHUNK_SIZE设为100000-200000均可,全程内存占用不超过2G,处理290万行数据耗时约1-2分钟 - 导出的CSV第一列为
Azure-CostCenter标签值,第二列为对应分组的总成本,未匹配标签的行第一列为N/A - 自动处理标签值前后多余空格,不会因为空格导致同一成本中心被拆分为多个分组
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

