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

DDD
发布: 2025-07-03 20:32:01
原创
657人浏览过

使用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的列赋值特性,您可以轻松地处理日常工作中遇到的类似数据整合需求。请根据您的具体场景调整代码中的文件路径、跳过行数和目标列名,以达到最佳效果。

以上就是使用Pandas合并多个Excel文件并添加来源文件名列的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号