第5章 数据融合之道:多源文件的聚合与分发艺术
第5章 数据融合之道:多源文件的聚合与分发艺术在数据分析的实战过程中,单一数据文件往往无法满足复杂业务需求。真实的商业场景中,数据可能分散在数十个甚至上百个Excel工作簿中,每个工作簿可能包含多个工作表。例如,连锁企业的各门店每日上传销售报表,财务系统每月导出分部门的预算数据,市场调研机构按区域提交的调研结果。如何高效地将这些分散的数据整合起来,或者根据业务需要将单一数据源拆分成多个分发文件,是数据分析师必须掌握的核心技能。本章将深入探讨如何利用ChatGPT与pandas的强大功能,实现多文件数据的整理。我们将从数据的拆分、合并、拼接、连接和追加五个维度展开,结合真实的商业场景,讲解每种操作背后的原理,并提供可直接运行的代码实例。通过本章的学习,你将能够游刃有余地应对各种多文件数据处理需求。5.1 数据拆分:化整为零的智慧数据拆分是将一个完整的数据集按照特定规则分解成多个子集的过程。这种操作在商业场景中非常常见。比如,总部需要将全国销售数据按区域拆分后分发给各区域经理,或者将包含全年数据的报表按月份拆分成12个工作簿。拆分的本质是数据分发,目的是让不同角色的业务人员只看到与自己相关的数据,既保护了数据安全,又提高了工作效率。从技术原理上讲,拆分操作基于pandas的筛选和分组功能。我们可以根据行索引、列名或某个字段的值,将原始DataFrame切割成若干子DataFrame,然后分别导出到不同的文件或工作表中。这个过程涉及的核心技能是条件筛选、分组迭代以及文件写入。5.1.1 纵向分割:按行拆分的艺术纵向拆分是指按照行的维度将一个数据表分割成多个数据表。最常见的场景是:一个包含全年销售记录的大表,需要按月拆分成12个小表,以便各业务部门按月复盘。或者,一个包含10万行数据的大文件,由于Excel的行数限制,需要拆分成多个文件。纵向拆分的原理非常直观:我们根据某个标识列(如月份、区域)的值,将原数据框过滤出不同的子集,然后分别保存。在实际操作中,我们通常需要先获取该标识列的所有唯一值,然后遍历这些唯一值,生成对应的子数据框。商业实例:某全国连锁零售企业,总部拥有一份“2024年全国销售明细.xlsx”文件,包含全年所有门店的销售记录,其中有一个“区域”列,取值为“华东”、“华南”、“华北”、“西南”。总经理要求将这份数据按区域拆分成四个独立的Excel文件,分发给各区域经理。我们需要编写一个自动化脚本来完成这个任务。importpandasaspdimportosclassVerticalDataSplitter:""" 纵向数据拆分器:根据某列的值将数据拆分成多个文件 """def__init__(self,SourceFilePath):self.SourceFilePath=SourceFilePath self.Data=NonedefLoadData(self,SheetName=0):""" 加载原始数据 """try:self.Data=pd.read_excel(self.SourceFilePath,sheet_name=SheetName)print(f"数据加载成功,共{self.Data.shape[0]}行,{self.Data.shape[1]}列")returnTrueexceptExceptionase:print(f"加载数据失败:{e}")returnFalsedefSplitByColumnValue(self,SplitColumn,OutputDir,FileNamePrefix):""" 根据指定列的值拆分数据 SplitColumn: 用于拆分的列名 OutputDir: 输出目录 FileNamePrefix: 输出文件名的前缀 """ifself.DataisNone:print("请先加载数据")return# 确保输出目录存在os.makedirs(OutputDir,exist_ok=True)# 获取拆分列的所有唯一值uniqueValues=self.Data[SplitColumn].unique()print(f"根据列 '{SplitColumn}' 拆分,共{len(uniqueValues)}个唯一值")forvalueinuniqueValues:# 筛选子数据subData=self.Data[self.Data[SplitColumn]==value]# 构造输出文件名outputPath=os.path.join(OutputDir,f"{FileNamePrefix}_{value}.xlsx")# 保存为Excel文件subData.to_excel(outputPath,index=False)print(f"已生成文件:{outputPath},共{len(subData)}行")print("拆分完成")# 商业实例:按区域拆分全国销售数据if__name__=="__main__":sourceFile=r"./data/2024年全国销售明细.xlsx"outputDirectory=r"./output/split_by_region/"splitter=VerticalDataSplitter(sourceFile)ifsplitter.LoadData():splitter.SplitByColumnValue("区域",outputDirectory,"区域销售数据")在上述代码中,我们定义了一个VerticalDataSplitter类,它负责加载原始数据,并根据指定列的值进行拆分。uniqueValues获取了所有不同的区域值,然后通过循环逐个筛选并保存。这种方法对于几十个甚至上百个分组值都非常有效。ChatGPT可以帮助我们快速生成这段代码,特别是当我们不确定如何遍历分组时,它能够提供清晰的指导。5.1.2 横向切割:按列拆分的策略横向拆分是指按照列的维度将一个宽表拆分成多个窄表。这种操作在以下场景中很常见:一个数据表包含过多的列,比如既有销售数据,又有客户数据,还有产品数据,我们希望将它们拆分成独立的表,以便分别管理和分析。横向拆分的原理是选择列的子集,然后创建新的DataFrame。商业实例:某电商平台的数据仓库导出了一份“用户订单产品详情宽表.xlsx”,包含了用户信息(用户ID、姓名、年龄)、订单信息(订单号、下单时间、订单状态)和产品信息(产品ID、产品名称、单价)三大类共20列。数据分析师希望将这些信息拆分成三个独立的文件:用户表、订单表、产品表,以便进行后续的规范化分析。importpandasaspdimportosclassHorizontalDataSplitter:""" 横向数据拆分器:根据列的分组拆分成多个文件 """def__init__(self,SourceFilePath):self.SourceFilePath=SourceFilePath self.Data=NonedefLoadData(self,SheetName=0):""" 加载原始数据 """try:self.Data=pd.read_excel(self.SourceFilePath,sheet_name=SheetName)print(f"数据加载成功,共{self.Data.shape[0]}行,{self.Data.shape[1]}列")returnTrueexceptExceptionase:print(f"加载数据失败:{e}")returnFalsedefSplitByColumnGroups(self,ColumnGroupsDict,OutputDir):""" 根据列分组字典拆分数据 ColumnGroupsDict: 字典,格式 {文件名: [列名列表]} """ifself.DataisNone:print("请先加载数据")returnos.makedirs(OutputDir,exist_ok=True)forfileName,columnListinColumnGroupsDict.items():# 检查列名是否都存在missingCols=[colforcolincolumnListifcolnotinself.Data.columns]ifmissingCols:print(f"警告: 文件{fileName}中缺少列{missingCols},跳过")continuesubData=self.Data[columnList]outputPath=os.path.join(OutputDir,f"{fileName}.xlsx")subData.to_excel(outputPath,index=False)print(f"已生成文件:{outputPath},共{len(subData)}行,{len(columnList)}列")print("横向拆分完成")# 商业实例:将宽表拆分为用户表、订单表、产品表if__name__=="__main__":sourceFile=r"./data/用户订单产品详情宽表.xlsx"outputDirectory=r"./output/split_by_column/"# 定义各子表需要的列columnGroups={"用户信息表":["用户ID","用户姓名","用户年龄","用户注册时间","用户等级"],"订单信息表":["订单号","用户ID","下单时间","订单状态","支付方式","订单金额"],"产品信息表":["产品ID"
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438414.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!