讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌墨吖_2548

陌墨吖_2548

发布时间:2025-07-03 20:32:01

|

788人浏览过

|

来源于php中文网

原创

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

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

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

核心思路与实现步骤

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

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

详细代码实现

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

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 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的列赋值特性,您可以轻松地处理日常工作中遇到的类似数据整合需求。请根据您的具体场景调整代码中的文件路径、跳过行数和目标列名,以达到最佳效果。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

811

2026.04.13

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

5861

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

3696

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

3480

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1444

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

717

2023.08.02

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn