展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Pandas 合并Excel文件并添加来源列

Pandas 合并Excel文件并添加来源列

本教程详细介绍了如何利用Python的glob模块查找指定目录下的多个Excel文件,并使用pandas库将它们高效合并为一个单一的数据框。核心内容是演示如何在合并过程中为每个记录动态添加一个新列,该列存储数据来源的原始文件名,从而方便数据追溯和分析。

本文目录

    使用 Pandas 合并多个 Excel 文件并添加源文件名列

    本教程详细介绍了如何利用 Python 的 glob 模块查找指定目录下的多个 Excel 文件,并使用 pandas 库将它们高效合并为一个单一的数据框。核心内容是演示如何在合并过程中为每个记录动态添加一个新列,该列存储数据来源的原始文件名,从而方便数据追溯和分析。

    在数据分析和处理的日常工作中,我们经常会遇到需要将分散在多个 Excel 文件中的数据整合到一起的情况。这些文件通常具有相同的结构,但包含了不同时间段或不同来源的数据。在合并这些数据时,一个常见的需求是保留每条记录的原始文件来源信息,以便后续的数据溯源、分组分析或问题排查。本教程将详细阐述如何使用 Python 的 pandas 库和 glob 模块实现这一目标。

    1. 准备工作

    首先,确保您的 Python 环境中安装了 pandas 库。如果尚未安装,可以使用以下命令进行安装:

    pip install pandas openpyxl

    openpyxl 是 pandas 读取 .xlsx 格式 Excel 文件所需的引擎。

    2. 核心思路

    合并多个 Excel 文件并添加源文件名列的核心思路如下:

    1. 使用 glob 模块查找指定路径下的所有目标 Excel 文件。
    2. 创建一个空的 pandas DataFrame,用于存储所有合并后的数据。
    3. 遍历每一个找到的 Excel 文件:
      • 读取当前 Excel 文件到临时的 DataFrame 中。
      • 在临时 DataFrame 中新增一个列,将当前文件的完整路径(或文件名)作为该列的值赋给所有行。
      • 将带有源文件名列的临时 DataFrame 追加到总的合并 DataFrame 中。
    4. 将最终合并的数据保存到新的 Excel 文件。

    3. 代码实现

    以下是实现上述功能的 Python 代码示例:

    import glob
    import pandas as pd
    import os # 导入 os 模块以获取文件名
    
    def combine_excel_files_with_filename(input_path_pattern, output_file, sheet_name='Sheet', skip_rows=0, use_cols=None):
        """
        合并指定路径下的所有 Excel 文件,并为每条记录添加源文件名列。
    
        Args:
            input_path_pattern (str): 用于匹配 Excel 文件的路径模式,例如 '../content/*.xlsx'。
            output_file (str): 合并后数据输出的 Excel 文件路径,例如 '../content/multiplesheet.xlsx'。
            sheet_name (str): 输出 Excel 文件的 sheet 名称,默认为 'Sheet'。
            skip_rows (int): 读取每个 Excel 文件时跳过的行数,默认为 0。
            use_cols (list): 读取每个 Excel 文件时使用的列名列表,默认为 None (读取所有列)。
        """
    
        # 1. 使用 glob 查找所有匹配的 Excel 文件
        files = glob.glob(input_path_pattern)
    
        if not files:
            print(f"警告:未找到匹配 '{input_path_pattern}' 的文件。")
            return
    
        combined_df = pd.DataFrame() # 初始化一个空的 DataFrame 用于存储合并结果
    
        print(f"开始处理 {len(files)} 个文件...")
    
        for file_path in files:
            try:
                # 2. 读取当前 Excel 文件
                # 注意:skiprows 和 usecols 参数根据实际文件结构调整
                current_df = pd.read_excel(file_path, skiprows=skip_rows, usecols=use_cols)
    
                # 如果指定了 use_cols,确保DataFrame中只有这些列,
                # 这一步在 read_excel 的 usecols 参数已经处理,但如果 use_cols 是一个子集,
                # 并且想确保顺序,可以再次筛选。原始问题中包含了这一步,这里保留。
                if use_cols:
                    current_df = current_df[use_cols]
    
                # 3. 添加源文件名列
                # os.path.basename(file_path) 可以只获取文件名,不包含路径
                current_df['filename'] = os.path.basename(file_path) 
    
                # 4. 将当前 DataFrame 追加到总的 DataFrame 中
                combined_df = pd.concat([combined_df, current_df], ignore_index=True)
                print(f"已处理文件: {os.path.basename(file_path)}")
    
            except Exception as e:
                print(f"处理文件 '{os.path.basename(file_path)}' 时发生错误: {e}")
                continue # 继续处理下一个文件
    
        # 5. 将合并后的数据保存到新的 Excel 文件
        if not combined_df.empty:
            try:
                combined_df.to_excel(output_file, sheet_name=sheet_name, index=False)
                print(f"\n所有文件已成功合并并保存到: {output_file}")
            except Exception as e:
                print(f"保存合并文件到 '{output_file}' 时发生错误: {e}")
        else:
            print("\n没有数据被成功合并。")
    
    # 示例调用
    if __name__ == "__main__":
        # 假设您的 Excel 文件位于 '../content/' 目录下
        # 并且每个文件都跳过第一行,并只使用指定列
        input_pattern = r'../content/*.xlsx' 
        output_path = "../content/multiplesheet.xlsx"
    
        # 原始问题中指定的列
        columns_to_use = ['Уровень','Код WBS','Код','Тип','Название'] 
    
        combine_excel_files_with_filename(
            input_path_pattern=input_pattern,
            output_file=output_path,
            skip_rows=1, # 根据原始问题,跳过第一行
            use_cols=columns_to_use
        )

    4. 关键步骤解析

    • glob.glob(input_path_pattern): 这个函数用于查找所有与指定模式匹配的文件路径。例如,'../content/*.xlsx' 会匹配 ../content/ 目录下所有以 .xlsx 结尾的文件。
    • pd.read_excel(file_path, skiprows=1, use_cols=['...']): 这是 pandas 读取 Excel 文件的核心函数。
      • file_path:要读取的 Excel 文件路径。
      • skiprows=1:表示在读取数据时跳过文件的第一行,这通常用于跳过标题行或不相关的数据。
      • use_cols=['...']:指定只读取 Excel 文件中的哪些列。这有助于减少内存使用并聚焦于所需数据。
    • current_df['filename'] = os.path.basename(file_path): 这是添加源文件名列的关键一步。os.path.basename(file_path) 函数从完整的文件路径中提取出文件名(不包含目录路径)。这个文件名会被赋值给 current_df 中新创建的名为 'filename' 的所有行。
    • pd.concat([combined_df, current_df], ignore_index=True): pd.concat 函数用于将两个或多个 DataFrame 沿指定轴连接起来。
      • [combined_df, current_df]:要连接的 DataFrame 列表。
      • ignore_index=True:在连接后重新生成索引,避免重复的索引值。

    5. 注意事项

    • 文件路径管理: 确保 input_path_pattern 和 output_file 的路径是正确的。使用相对路径(如 ../content/)时,要明确脚本运行的当前工作目录。

    • 内存效率: 对于数量巨大或单文件很大的 Excel 文件,频繁使用 pd.concat 在循环内部可能会导致性能下降,因为它每次都会创建新的 DataFrame。一个更高效的方法是先将每个 current_df 存储在一个列表中,然后在循环结束后一次性调用 pd.concat:

      # 优化后的合并部分
      all_dfs = []
      for file_path in files:
          try:
              current_df = pd.read_excel(file_path, skiprows=skip_rows, use_cols=use_cols)
              if use_cols:
                  current_df = current_df[use_cols]
              current_df['filename'] = os.path.basename(file_path)
              all_dfs.append(current_df)
              print(f"已处理文件: {os.path.basename(file_path)}")
          except Exception as e:
              print(f"处理文件 '{os.path.basename(file_path)}' 时发生错误: {e}")
              continue
      
      if all_dfs:
          combined_df = pd.concat(all_dfs, ignore_index=True)
      else:
          combined_df = pd.DataFrame() # 确保在没有文件时 combined_df 仍然是空的 DataFrame

      这种方式在处理大量文件时能显著提高性能。

    • 错误处理: 在示例代码中,我们添加了 try-except 块来捕获文件读取或处理过程中可能出现的错误,例如文件损坏或格式不正确。这增强了程序的健壮性。

    • 列名与数据类型: 确保所有 Excel 文件的列名和数据类型一致,否则合并后可能会出现不一致的数据类型或额外的列。use_cols 参数有助于强制列的一致性。

    • 索引: ignore_index=True 是非常重要的,它会为合并后的 DataFrame 创建一个全新的、连续的索引,避免了原始文件索引的混淆。

    6. 总结

    通过本教程,您已经掌握了如何使用 Python 的 pandas 库和 glob 模块高效地合并多个 Excel 文件,并在合并过程中为每条记录动态添加一个指示其来源文件的新列。这一技巧在数据集成、报告生成和数据追溯等场景中非常实用,能够极大地提高您的数据处理效率和分析能力。记住,根据实际数据量和性能需求,可以选择不同的合并策略(如先收集列表再 concat)来优化代码。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。