0

0

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

DDD

DDD

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

|

768人浏览过

|

来源于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代码示例:

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)

    这种方式通常更高效。

    空心菜的米库
    空心菜的米库

    1,对界面进行了美化2,对文件里边相同代码进行了综合3,增加了点击次数统计,并对3次点击以上的域名增加热门字样4,对本站出售和个人出售进行了划分5,增加钻石状态说明6,增加了完整的后台界面7,增加对资料修改功能8,增加回收站,可以任意删除域名、恢复删除域名和永久删除数据9,还有其他的细节大家自己看~10.增加域名证书显示11.域名到期时间采用日历控件形式12.后台登陆添加了验证码功能13.还有很多

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

总结

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

56

2025.12.04

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

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

1398

2023.07.25

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

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

408

2023.07.31

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

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

562

2023.08.02

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

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

1243

2023.08.02

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

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

368

2023.08.02

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

4526

2023.08.09

java导出excel
java导出excel

在Java中,我们可以使用Apache POI库来导出Excel文件。本专题提供java导出excel的相关文章,大家可以免费体验。

408

2023.08.18

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

22

2026.01.27

热门下载

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

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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