当前位置:首页 > 文章列表 > 文章 > python教程 > Pandas合并Excel并添加来源列技巧

Pandas合并Excel并添加来源列技巧

2025-07-24 12:36:28 0浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习文章的朋友们,也希望在阅读本文《Pandas合并Excel文件并添加来源列方法》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新文章相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

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

本教程详细介绍了如何使用Python的Pandas库高效地合并多个Excel文件到一个单一的数据框中。文章核心内容是解决在数据合并过程中,如何为每一行数据添加一个新列,以记录其原始所属的文件名,从而实现数据的可追溯性。通过清晰的代码示例和专业指导,读者将掌握利用glob和pandas实现数据整合与溯源的关键技巧。

在日常数据处理工作中,我们经常需要将分散在多个Excel文件中的数据整合到一起进行分析。一个常见的需求是,在合并数据的同时,能够追溯每一条记录的来源文件。这对于数据审计、问题排查或理解数据上下文至关重要。本文将提供一个基于Pandas库的专业解决方案,帮助您高效地完成这项任务。

核心思路与实现步骤

要实现将多个Excel文件合并并添加来源文件名列的功能,我们需要遵循以下步骤:

  1. 查找目标文件:使用glob模块根据指定的模式查找所有需要合并的Excel文件。
  2. 初始化合并数据框:创建一个空的Pandas DataFrame,用于存放所有合并后的数据。
  3. 迭代处理每个文件
    • 逐一读取每个Excel文件到临时的DataFrame中。
    • 在读取数据的同时,根据需求跳过特定的行(如标题行)并选择所需的列。
    • 关键步骤:为当前的临时DataFrame添加一个新列,该列的值为当前文件的完整路径或文件名。
    • 将处理后的临时DataFrame追加到主合并数据框中。
  4. 保存结果:将最终合并的数据框保存到一个新的Excel文件。

详细代码实现

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

import glob
import pandas as pd
import os # 导入os模块用于路径操作

def combine_excel_files_with_filename(input_path_pattern, output_file_path, sheet_name='Sheet1', skiprows=0, usecols=None):
    """
    合并指定路径下的所有Excel文件,并为每行数据添加来源文件名列。

    Args:
        input_path_pattern (str): 用于查找Excel文件的路径模式,例如 '../content/*.xlsx'。
        output_file_path (str): 合并后数据保存的Excel文件路径。
        sheet_name (str): 保存合并数据时的工作表名称,默认为'Sheet1'。
        skiprows (int or list-like): 读取Excel时要跳过的行数或行索引,默认为0。
        usecols (list-like or None): 读取Excel时要使用的列名或列索引,默认为None(使用所有列)。

    Returns:
        pd.DataFrame: 合并后的DataFrame。
    """

    # 使用glob查找所有匹配的Excel文件
    files = glob.glob(input_path_pattern)

    if not files:
        print(f"在路径模式 '{input_path_pattern}' 下未找到任何Excel文件。")
        return pd.DataFrame()

    combined_df = pd.DataFrame() # 初始化一个空的DataFrame用于存储合并结果

    print(f"开始处理 {len(files)} 个Excel文件...")

    for file_path in files:
        try:
            # 读取当前Excel文件
            # 注意:如果usecols是列名列表,确保这些列在所有文件中都存在,否则可能引发KeyError。
            # 这里为了与原始问题保持一致,保留了usecols和随后的列选择。
            current_df = pd.read_excel(file_path, skiprows=skiprows, usecols=usecols)

            # 确保只选择需要的列(即使usecols已指定,此步骤可用于列的重新排序或进一步筛选)
            if usecols:
                current_df = current_df[usecols]

            # 获取文件名(不含路径)作为列值
            # 或者使用完整路径:current_df['filename'] = file_path
            filename = os.path.basename(file_path)
            current_df['来源文件名'] = filename # 添加新的列,值为当前文件的文件名

            # 将当前DataFrame追加到合并的DataFrame中
            combined_df = pd.concat([combined_df, current_df], ignore_index=True)
            print(f"已处理文件: {filename}")

        except Exception as e:
            print(f"处理文件 '{file_path}' 时发生错误: {e}")
            continue # 继续处理下一个文件

    # 将合并后的DataFrame保存到新的Excel文件
    try:
        combined_df.to_excel(output_file_path, sheet_name=sheet_name, index=False)
        print(f"\n所有文件已成功合并并保存到 '{output_file_path}'。")
    except Exception as e:
        print(f"保存文件 '{output_file_path}' 时发生错误: {e}")

    return combined_df

# 示例用法:
if __name__ == "__main__":
    # 假设Excel文件位于 'content' 目录下
    # 例如:../content/file1.xlsx, ../content/file2.xlsx
    input_pattern = r'../content/*.xlsx'
    output_file = "../content/multiplesheet_combined.xlsx"

    # 假设原始问题中的列名
    target_columns = ['Уровень','Код WBS','Код','Тип','Название']

    # 调用函数执行合并
    final_combined_df = combine_excel_files_with_filename(
        input_path_pattern=input_pattern,
        output_file_path=output_file,
        skiprows=1, # 根据原始问题,跳过第一行
        usecols=target_columns # 使用指定的列
    )

    if not final_combined_df.empty:
        print("\n合并后的数据框前5行:")
        print(final_combined_df.head())

代码解析

  • import glob: 导入glob模块,用于查找符合特定模式的文件路径。例如'../content/*.xlsx'会匹配../content/目录下所有以.xlsx结尾的文件。
  • import pandas as pd: 导入Pandas库,它是Python中进行数据分析的核心库。
  • import os: 导入os模块,用于操作系统相关的路径操作,例如os.path.basename()可以从完整路径中提取文件名。
  • glob.glob(input_path_pattern): 找到所有符合模式的文件路径列表。
  • pd.DataFrame(): 初始化一个空的DataFrame,作为最终合并数据的基础。
  • pd.read_excel(file_path, skiprows=skiprows, usecols=usecols): 读取单个Excel文件。
    • file_path:当前Excel文件的路径。
    • skiprows:指定读取时跳过的行数。例如skiprows=1会跳过第一行。
    • usecols:指定要读取的列。可以是列名列表或列索引列表。
  • current_df['来源文件名'] = filename: 这是实现核心功能的关键行。它在当前读取的current_df中添加了一个名为'来源文件名'的新列,并将当前文件的文件名(通过os.path.basename(file_path)获取)赋给这一列的所有行。如果您需要完整的文件路径而非仅仅文件名,可以直接使用current_df['来源文件名'] = file_path。
  • pd.concat([combined_df, current_df], ignore_index=True): 将处理后的current_df追加到combined_df中。ignore_index=True参数会重置合并后数据框的索引,避免出现重复索引。
  • combined_df.to_excel(output_file_path, sheet_name=sheet_name, index=False): 将最终合并的DataFrame保存为Excel文件。index=False表示不将DataFrame的索引写入Excel文件。

注意事项

  1. 文件路径与模式:确保input_path_pattern能够正确匹配到所有目标Excel文件。使用相对路径(如../content/*.xlsx)或绝对路径取决于您的项目结构。
  2. 列名一致性:如果使用usecols指定列名,请确保这些列名在所有待合并的Excel文件中都存在且拼写一致,否则pd.read_excel或后续的列选择可能会引发错误。
  3. 内存管理:对于非常大量的Excel文件或单个文件非常大的情况,循环中使用pd.concat可能会导致性能问题,因为每次concat都会创建新的DataFrame。更优的实践是先将所有读取的DataFrame存储在一个列表中,然后在循环结束后一次性使用pd.concat合并整个列表,例如:
    all_dfs = []
    for file_path in files:
        current_df = pd.read_excel(...)
        current_df['来源文件名'] = os.path.basename(file_path)
        all_dfs.append(current_df)
    combined_df = pd.concat(all_dfs, ignore_index=True)

    这种方式通常更高效。

  4. 错误处理:在实际应用中,建议添加更健壮的错误处理机制,例如使用try-except块捕获文件读取或处理过程中可能出现的异常(如文件损坏、权限问题等),以提高程序的鲁棒性。
  5. 索引重置:pd.concat函数中的ignore_index=True参数非常重要,它确保合并后的DataFrame拥有一个连续的、不重复的索引,这对于后续的数据分析非常有利。

总结

通过本教程,您已经掌握了如何使用Python的Pandas库高效地合并多个Excel文件,并为合并后的数据添加来源文件名列。这个功能在数据集成和可追溯性方面具有重要意义。通过灵活运用glob进行文件查找、pd.read_excel进行数据读取、以及巧妙地利用Pandas的列赋值特性,您可以轻松地处理日常工作中遇到的类似数据整合需求。请根据您的具体场景调整代码中的文件路径、跳过行数和目标列名,以达到最佳效果。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

Golang反射机制在框架中的应用解析Golang反射机制在框架中的应用解析
上一篇
Golang反射机制在框架中的应用解析
JavaScript实现WebSocket通信全解析
下一篇
JavaScript实现WebSocket通信全解析
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    514次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    73次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    42次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    79次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    10次使用
  • 迅捷AIPPT:AI智能PPT生成器,高效制作专业演示文稿
    迅捷AIPPT
    迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
    65次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码