Pandas教程:使用Pandas合并多个Excel文件


在数据处理和分析中,合并多个Excel文件是一项常见的任务。本文将详细介绍如何使用Python库Pandas来完成这一任务。我们将从基本概念入手,逐步深入,最终通过实战示例完成多个.xlsx文件的合并。

1. 环境准备


1.1 安装Pandas

在开始之前,确保你已经安装了Pandas库。如果还没有安装,可以使用以下命令进行安装:

pip install pandas openpyxl

1.2 准备工作

确保你有一个包含多个Excel文件的文件夹。每个Excel文件的结构应当相似,例如,它们都有相同的列名。

2. 基本概念


2.1 Pandas简介

Pandas是一个强大的数据分析和数据处理库,它提供了灵活的数据结构,特别是DataFrame,这使得数据的操作变得简单高效。

2.2 DataFrame的基本操作

在Pandas中,DataFrame是一个二维标签数据结构,类似于表格。你可以使用DataFrame进行数据的读取、写入、筛选和合并等操作。

3. 读取Excel文件


在合并Excel文件之前,我们需要先了解如何读取单个Excel文件。我们可以使用pd.read_excel()函数来读取Excel文件。

import pandas as pd

# 读取单个Excel文件
df = pd.read_excel('path/to/your/file.xlsx')
print(df.head()) # 显示前5行数据

4. 合并多个Excel文件


4.1 获取文件列表


首先,我们需要获取文件夹中所有Excel文件的列表。我们可以使用os库来实现这一功能。

import os

# 获取指定目录下的所有xlsx文件
folder_path = 'path/to/your/folder'
files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')]

4.2 读取并合并数据


现在,我们可以使用一个循环来读取每个文件,并将其合并到一个DataFrame中。

# 创建一个空的DataFrame
combined_df = pd.DataFrame()

# 读取每个文件并合并
for file in files:
    file_path = os.path.join(folder_path, file)
    df = pd.read_excel(file_path)
    combined_df = pd.concat([combined_df, df], ignore_index=True)

# 查看合并后的数据
print(combined_df.head())

4.3 处理重复数据


合并数据时,可能会出现重复的行。我们可以使用drop_duplicates()方法来去除重复的行。

# 去除重复行
combined_df = combined_df.drop_duplicates()

5. 数据存储


合并完成后,我们需要将最终的数据保存到一个新的Excel文件中。我们可以使用to_excel()方法进行保存。

# 将合并后的数据保存为新的Excel文件
combined_df.to_excel('path/to/your/combined_file.xlsx', index=False)

6. 完整示例代码


结合上述所有步骤,下面是一个完整的示例代码,用于合并文件夹中所有的Excel文件。

import os
import pandas as pd

# 指定文件夹路径
folder_path = 'path/to/your/folder'

# 获取所有xlsx文件
files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')]

# 创建一个空的DataFrame
combined_df = pd.DataFrame()

# 读取每个文件并合并
for file in files:
    file_path = os.path.join(folder_path, file)
    df = pd.read_excel(file_path)
    combined_df = pd.concat([combined_df, df], ignore_index=True)

# 去除重复行
combined_df = combined_df.drop_duplicates()

# 保存合并后的数据
combined_df.to_excel('path/to/your/combined_file.xlsx', index=False)

print("合并完成,文件已保存。")

7.代码优化


7.1用类去重新组织代码

import os
import pandas as pd

class ExcelMerger:
    def __init__(self, folder_path, output_file):
        """初始化ExcelMerger类
        
        参数:
        folder_path: 包含待合并Excel文件的文件夹路径
        output_file: 合并后输出的Excel文件名
        """
        self.folder_path = folder_path
        self.output_file = output_file
        self.combined_df = pd.DataFrame()

    def get_files(self):
        """获取文件夹下所有的xlsx文件"""
        return [f for f in os.listdir(self.folder_path) if f.endswith('.xlsx')]

    def read_and_combine(self):
        """读取并合并所有Excel文件"""
        files = self.get_files()
        for file in files:
            file_path = os.path.join(self.folder_path, file)
            df = pd.read_excel(file_path)
            self.combined_df = pd.concat([self.combined_df, df], ignore_index=True)

    def remove_duplicates(self):
        """去除合并后的重复数据"""
        self.combined_df = self.combined_df.drop_duplicates()

    def save_to_excel(self):
        """将合并后的数据保存为Excel文件"""
        self.combined_df.to_excel(self.output_file, index=False)

    def merge(self):
        """执行合并操作的主方法"""
        self.read_and_combine()
        self.remove_duplicates()
        self.save_to_excel()
        print(f"合并完成,文件已保存到 {self.output_file}。")

# 使用示例
if __name__ == "__main__":
    folder_path = 'path/to/your/folder'
    output_file = 'path/to/your/combined_file.xlsx'
    
    merger = ExcelMerger(folder_path, output_file)
    merger.merge()

优化说明

  1. 封装性:将代码逻辑封装在ExcelMerger类中,提高了代码的模块化程度。
  2. 方法分离:将每个功能分离成不同的方法,使得逻辑更加清晰,便于维护和扩展。
  3. 易于使用:用户只需实例化ExcelMerger类,然后调用merge()方法即可完成合并操作。

7.2增加异常处理

import os
import pandas as pd

class ExcelMerger:
    def __init__(self, folder_path, output_file):
        """初始化ExcelMerger类
        
        参数:
        folder_path: 包含待合并Excel文件的文件夹路径
        output_file: 合并后输出的Excel文件名
        """
        self.folder_path = folder_path
        self.output_file = output_file
        self.combined_df = pd.DataFrame()

    def get_files(self):
        """获取文件夹下所有的xlsx文件"""
        try:
            files = [f for f in os.listdir(self.folder_path) if f.endswith('.xlsx')]
            if not files:
                raise FileNotFoundError("该文件夹中没有找到任何Excel文件。")
            return files
        except FileNotFoundError as e:
            print(e)
            return []

    def read_and_combine(self):
        """读取并合并所有Excel文件"""
        files = self.get_files()
        for file in files:
            file_path = os.path.join(self.folder_path, file)
            try:
                df = pd.read_excel(file_path)
                self.combined_df = pd.concat([self.combined_df, df], ignore_index=True)
                print(f"成功读取文件: {file}")
            except Exception as e:
                print(f"读取文件 {file} 时发生错误: {e}")

    def remove_duplicates(self):
        """去除合并后的重复数据"""
        initial_count = self.combined_df.shape[0]
        self.combined_df = self.combined_df.drop_duplicates()
        final_count = self.combined_df.shape[0]
        print(f"去除重复行: 从 {initial_count} 行减少到 {final_count} 行")

    def save_to_excel(self):
        """将合并后的数据保存为Excel文件"""
        try:
            self.combined_df.to_excel(self.output_file, index=False)
            print(f"合并的数据已保存到 {self.output_file}")
        except Exception as e:
            print(f"保存文件时发生错误: {e}")

    def merge(self):
        """执行合并操作的主方法"""
        self.read_and_combine()
        self.remove_duplicates()
        if not self.combined_df.empty:
            self.save_to_excel()
        else:
            print("没有合并的数据,无法保存文件。")

# 使用示例
if __name__ == "__main__":
    folder_path = 'path/to/your/folder'
    output_file = 'path/to/your/combined_file.xlsx'
    
    merger = ExcelMerger(folder_path, output_file)
    merger.merge()

优化说明

  1. 异常捕获
  2. 在get_files方法中捕获FileNotFoundError,如果文件夹内没有Excel文件,将给出提示。
  3. 在read_and_combine方法中捕获读取Excel文件时的任何异常,以确保即使某个文件无法读取,程序仍然能够继续处理其他文件。
  4. 在save_to_excel方法中捕获保存文件时的异常,以处理可能的文件写入错误。
  5. 反馈信息
  6. 在每个主要步骤中添加了打印信息,以便用户了解当前的处理状态和结果。
  7. 数据检查
  8. 在merge方法中,检查合并后的DataFrame是否为空,只有在有数据的情况下才进行保存操作。

相关文章

Python 多任务编程

多任务的介绍利用现学知识能够让两个函数或者方法同时执行吗?不能,因为之前写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务多任务的最大...

Python实现多进程的四种方式

方式一: os.fork()# -*- coding:utf-8 -*- """ pid=os.fork() 1.只用在Unix系统中有效,Windows系统中无效 2...

python多任务编程

Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group:指定进程组,目前只能使用Nonetarget:执行...

【Python程序开发系列】一文教你使用协程处理多任务(案例源码)

这是Python程序开发系列原创文章,我的第188篇原创文章。一、协程相关背景知识前文回顾:Python语言高级实战-基于协程的方式来实现异步并发编程(附源码和实现效果)【Python程序开发系列】进...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:import multiprocessing import requests def crawl(url): response = re...

Python中的多进程详解,让你的程序更快更强!

Python是一门高级编程语言,拥有简单易用、面向对象、可扩展等优点,因此被广泛应用于各种领域。但是在Python中,由于GIL(全局解释器锁)的存在,导致了多线程的效率不高。因此,在某些情况下,我们...