百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

使用Pandas合并excel文件(使用pandas合并多个excel)

liuian 2025-05-02 11:48 12 浏览

#头条创作挑战赛#

有一个这样的需求,有很多数据格式相同的excel文件分散在不同的目录,需要把它们的数据合到一个excel文件中,excel文件不多的情况下也许可以手工整理,假如有成百上千和文件要合并,手工合并将是很麻烦的事情,可以使用python语言的第三方库pandas来轻松解决这个问题。

先来梳理下实现的思路:

  1. 首先,遍历整个目录及子目录,识别出需要合并的excel文件,添加到合并文件列表。
  2. 接下来,使用pandas的read_excel方法读取所有的excel,将读取的数据对象添加到列表中。
  3. 最后,使用pandas的concat方法将pandas读取的excel数据对象列表合并,使用to_excel方法生成新的excel文件。

遍历文件

├─示例文件夹01
│  │  data_001.xlsx
│  │
│  └─文件夹001
│          data_002.xlsx
│
└─示例文件夹02
        data_003.xlsx

本次示例文件目录结构如上所示,需要合并的excel文件名拥有"data_"前缀,可以使用os.walk方法遍历目录及子目录下的文件,我们在交互式命令中演示os.walk方法返回的结果。

>>> import os
>>> paths = os.walk("./")
>>> for item in paths:
...   print(item)
...
('./', ['示例文件夹01', '示例文件夹02'], [])
('./示例文件夹01', ['文件夹001'], ['data_001.xlsx'])
('./示例文件夹01\\文件夹001', [], ['data_002.xlsx'])
('./示例文件夹02', [], ['data_003.xlsx'])

os.walk方法返回要遍历的目录及其子目录下的所有文件,它返回的是一个三元组(root, dirs, files),root表示的是当前正在遍历的文件夹,dirs是一个列表,内容是该文件夹下的目录(不包括子目录),files是一个列表,内容是root所表示的文件夹下的文件。那么,当找到files中一个匹配的excel文件,该文件的完整路径就可以通过root+file名拼接得到。

Pandas上手

pandas不是python标准库,需要使用pip install pandas进行安装,如果操作excel还需要安装openpyxl库,即pip install openpyxl
data_001.xlsx:
name  age
a     11
b     12

data_002.xlsx:
name  age
c     13
d     14

data_003.xlsx:
name  age
e     15
f     16

本次示例中各excel文件的内容如上所示,虽然本文不会使用pandas的很多功能,这里还是在交互式命令中演示一些pandas的基本操作。另外,Pandas是非常强大的数据分析工具,其功能远远不止这里提到的一些皮毛,值得深入学习掌握。

>>> import pandas as pd

# DataFrame是一种表格型的数据结构,类似于二维数组
>>> df = pd.DataFrame([["a",11],["b",12]],columns=["名字","年龄"])
>>> df
  名字  年龄
0  a  11
1  b  12

# 过滤名字为a的行
>>> df[df["名字"]=="a"]
  名字  年龄
0  a  11

# 过滤年龄为12的行
>>> df[df["年龄"]==12]
  名字  年龄
1  b  12

# 筛选名字这一列数据
>>> df["名字"]
0    a
1    b
Name: 名字, dtype: object

# 取单元格0行、1列的数据
>>> df.iloc[0,1]
11

# 取单元格1行、0列的数据
>>> df.iloc[1,0]
'b'

# 将数据输出为excel文件
>>> df.to_excel("excel_demo.xlsx")

上面to_excel方法生成excel文件内容如下图所示

合并excel文件

有了上面的基础,就可以开始实现合并excel文件的脚本了,参考代码如下

import os

import pandas as pd

# 合并当前目录及子目录下前缀为data_的excel文件
def mergeExcel(prefix="data_"):
	# 遍历当前目录及子目录
    paths = os.walk("./")
    excel_list = []
    for root, dirs, files in paths:
        for file_name in files:
            if file_name.startswith(prefix):
	            # 将满足data_前缀的excel文件路径+文件名添加到excel_list列表
                excel_list.append(os.path.join(root, file_name))
            
    dataframe_lst = []
    print("开始合并excel文件...")
    # 遍历每一个符合要求的excel文件
    for excel_file in excel_list:
	    # pandas读取excel内容,并添加到dafaframe_lst列表
        dataframe_lst.append(pd.read_excel(excel_file))
    # 将dataframe_lst中的excel数据合并为一个DataFrame数据结构
    dataframe_merged = pd.concat(dataframe_lst)
    # 将合并的DataFrame生成新的excel文件
    dataframe_merged.to_excel("合并文件.xlsx", index=False)

if __name__ == "__main__":
    mergeExcel()

合并后的文件内容如下

更进一步,显示进度条

上面的脚本已经满足了最初的需求,但是在执行脚本的过程中看不到任何反馈,不知道什么时候脚本会执行结束,接下来为脚本添加进度条显示。可以使用使用tqdm包,执行命令pip install tqdm进行安装,tqdm包非常容易使用,增加了进度条的脚本执行结果显示如下,它是动态显示进度的,这里只是展示最终的结果。

> python .\merge.py
开始合并excel文件...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:00<00:00,  3.24it/s]

下面是增加了进度条功能的代码,可以发现除了导入tdqm的语句之外,只有一行代码与之前不同,使用tqdm非常简单,只需要将需要展示进度的任意可迭代的对象传给tqdm方法即可。

import os

import pandas as pd
from tqdm import tqdm

# 合并当前目录及子目录下前缀为data_的excel文件
def mergeExcel(prefix="data_"):
	# 遍历当前目录及子目录
    paths = os.walk("./")
    excel_list = []
    for root, dirs, files in paths:
        for file_name in files:
            if file_name.startswith(prefix):
	            # 将满足data_前缀的excel文件路径+文件名添加到excel_list列表
                excel_list.append(os.path.join(root, file_name))
            
    dataframe_lst = []
    print("开始合并excel文件...")
    # 遍历每一个符合要求的excel文件
    for excel_file in tqdm(excel_list):
	    # pandas读取excel内容,并添加到dafaframe_lst列表
        dataframe_lst.append(pd.read_excel(excel_file))
    # 将dataframe_lst中的excel数据合并为一个DataFrame数据结构
    dataframe_merged = pd.concat(dataframe_lst)
    # 将合并的DataFrame生成新的excel文件
    dataframe_merged.to_excel("合并文件.xlsx", index=False)

if __name__ == "__main__":
    mergeExcel()

参考文献

[1]. 《流畅的python》17.5 显示下载进度并处理错误,第429页;

相关推荐

打开新世界,教你用RooCode+Copliot+Mcp打造一个自己的Manus

本文耗时两天打造,想要一遍走通需要花点时间,建议找个专注的时间开搞!这不仅是个免费使用claude3.5的方案,也是一个超级智能体方案,绝对值得一试!最近Manus真是赚足了眼球,然而我还是没有邀请码...

Git仓库(git仓库有哪些)

#Git仓库使用方法流程详解##一、环境搭建与基础配置###1.1安装与初始化-**安装Git**:官网下载安装包,默认配置安装-**配置全局信息**:```bashgitconfig...

idea版的cursor:Windsurf Wave 7(ideawalk)

在企业环境中,VisualStudioCode和JetBrains系列是最常用的开发工具,覆盖了全球绝大多数开发者。这两类IDE各有优势,但JetBrains系列凭借其针对特定语言和企业场景的深度...

Ai 编辑器 Cursor 零基础教程:推箱子小游戏实战演练

最近Ai火的同时,Ai编辑器Cursor同样火了一把。今天我们就白漂一下Cursor,使用免费版本搞一个零基础教程,并实战演练一个“网页版的推箱子小游戏”。通过这篇文章,让你真正了解cursor是什么...

ChatGPT深度集成于苹果Mac软件 编码能力得到提升

【CNMO科技消息】近日,OpenAI发布了针对MacOS的桌面应用程序,并宣布了一系列与各类应用程序的互操作性功能,标志着ChatGPT正在从聊天机器人向AI智能体工具进化。此次发布的MacOS桌面...

日常开发中常用的git操作命令和使用技巧

日常开发中常用的git操作命令,从配置、初始化本地仓库到提交代码的常用git操作命令使用git前的配置刚使用git,先要在电脑上安装好git,接着我们需要配置一下帐户信息:用户名和邮箱。#设置用户名...

Trae IDE 如何与 GitHub 无缝对接?

TraeIDE内置了GitHub集成功能,让开发者可以直接在IDE里管理代码仓库和版本控制。1.直接从GitHub克隆项目如果你想把GitHub上的代码拉到本地,Trae提供了...

China&#39;s diplomacy to further provide strong support for country&#39;s modernization: FM

BEIJING,March7(Xinhua)--ChineseForeignMinisterWangYisaidFridaythatChina'sdiplomacywil...

三十分钟入门基础Go(Java小子版)(java入门级教程)

前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与...

China will definitely take countermeasures in response to arbitrary pressure: FM

BEIJING,March7(Xinhua)--Chinawilldefinitelytakecountermeasuresinresponsetoarbitrarypre...

Go操作etcd(go操作docker实现沙箱)

Go语言操作etcd,这里推荐官方包etcd/clientv3。文档:https://pkg.go.dev/go.etcd.io/etcd/clientv3etcdv3使用gRPC进行远程过程调...

腾讯 Go 性能优化实战(腾讯游戏优化软件)

作者:trumanyan,腾讯CSIG后台开发工程师项目背景网关服务作为统一接入服务,是大部分服务的统一入口。为了避免成功瓶颈,需要对其进行尽可能地优化。因此,特别总结一下golang后台服务...

golang 之JWT实现(golang gin jwt)

什么是JSONWebToken?JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经...

一文看懂 session 和 cookie(session cookie的区别)

-----------cookie大家应该都熟悉,比如说登录某些网站一段时间后,就要求你重新登录;再比如有的同学很喜欢玩爬虫技术,有时候网站就是可以拦截住你的爬虫,这些都和cookie有关。如果...

有望取代 java?GO 语言项目了解一下

GO语言在编程界一直让人又爱又恨,有人说“GO将统治下一个十年”,“几乎所有新的、有趣的东西都是用Go写的”;也有人说它过于死板,使用感太差。国外有Google、AWS、Cloudflar...