一、前言:为什么用 Python 合并表格?
日常工作中,我们经常遇到需要合并多个 Excel 表格的场景:比如汇总各部门的销售数据、整合多批次的调研结果、合并分散的客户信息等。传统的 Excel 手动复制粘贴不仅效率低下,还容易出错,尤其当表格数量多、数据量大时,更是耗时耗力。
Python 的pandas库提供了简洁强大的表格处理能力,只需几行代码就能完成复杂的表格合并需求,且支持批量处理、自动化执行,极大提升数据处理效率。本文将详细讲解同结构表格拼接、不同结构表格关联两种核心场景的实现方法,附完整代码和实战案例。
二、前置准备:环境搭建
在开始前,需要安装两个关键库:
pandas:用于数据读取、处理和合并
openpyxl/xlrd:用于 Excel 文件的读写(根据 Excel 版本选择)
安装命令(终端 / 命令行执行):

安装核心库

pip install pandas

处理.xlsx文件(推荐,支持Excel 2007+)

pip install openpyxl

若需处理旧版.xls文件,额外安装

pip install xlrd==1.2.0 # 注意:xlrd 2.0+不再支持.xls

三、核心场景 1:同结构表格纵向拼接(最常用)
场景描述
多个 Excel 表格的列名完全一致,仅需将数据按行合并(比如每天的销售报表、各门店的业绩数据)。
实现思路
读取指定文件夹下的所有 Excel 文件;
用列表存储每个表格的数据;
使用pd.concat()函数纵向拼接所有数据;
去重、保存结果到新 Excel。
完整代码
import pandas as pd
import os

def merge_same_structure_tables(folder_path, output_file):
“”"
合并文件夹下所有同结构的Excel表格(纵向拼接)
:param folder_path: 表格所在文件夹路径
:param output_file: 合并后输出的Excel文件名
“”"
# 存储所有表格数据的列表
all_data = []

# 遍历文件夹下的所有文件
for filename in os.listdir(folder_path):
    # 只处理Excel文件(.xlsx/.xls)
    if filename.endswith(('.xlsx', '.xls')):
        # 拼接文件完整路径
        file_path = os.path.join(folder_path, filename)
        print(f"正在读取文件:{filename}")
        
        # 读取Excel(根据文件后缀选择引擎)
        if filename.endswith('.xlsx'):
            df = pd.read_excel(file_path, engine='openpyxl')
        else:
            df = pd.read_excel(file_path, engine='xlrd')
        
        # 添加“数据来源”列(可选,便于追溯数据)
        df['数据来源'] = filename
        
        # 将当前表格数据加入列表
        all_data.append(df)

# 纵向拼接所有表格(ignore_index=True重置索引)
merged_df = pd.concat(vip.youchengcanada.com  tt.youchengcanada.com  tb.youchengcanada.com  kaojiaxiao.com  www.kaojiaxiao.com  m.kaojiaxiao.com  wap.kaojiaxiao.com  vip.kaojiaxiao.comall_data, ignore_index=True)

# 去重(可选,根据需求决定是否保留重复行)
merged_df = merged_df.drop_duplicates()

# 保存合并结果
merged_df.to_excel(output_file, index=False, engine='openpyxl')
print(f"\n合并完成!结果已保存至:{output_file}")
print(f"合并后数据总行数:{len(merged_df)}")

------------------- 调用函数 -------------------

if name == “main”:
# 替换为你的表格文件夹路径(相对路径或绝对路径均可)
input_folder = “销售数据文件夹”
# 合并后输出的文件名
output_excel = “合并后的销售总数据.xlsx”

merge_same_structure_tables(input_folder, output_excel)

关键说明
pd.concat(all_data, ignore_index=True):核心拼接函数,ignore_index=True会重置合并后的行索引,避免索引重复;
drop_duplicates():去除重复行,若需保留重复数据可删除该句;
“数据来源” 列:可选但推荐添加,便于后续排查数据问题。
四、核心场景 2:不同结构表格横向关联(按关键字合并)
场景描述
多个表格的列名不同,但存在共同的关键字段(比如 “客户 ID”“产品编号”),需要按关键字段横向合并数据(比如客户基本信息表 + 客户订单表)。
实现思路
分别读取需要关联的表格;
确定共同的关键字段(如 “客户 ID”);
使用pd.merge()函数按关键字段合并;
处理缺失值、保存结果。
完整代码
import pandas as pd

def merge_different_structure_tables(table1_path, table2_path, key_column, output_file):
“”"
按关键字段合并两个不同结构的Excel表格(横向关联)
:param table1_path: 第一个表格路径
:param table2_path: 第二个表格路径
:param key_column: 共同的关键字段(如“客户ID”)
:param output_file: 合并后输出的Excel文件名
“”"
# 读取两个表格
df1 = pd.read_excel(table1_path, engine=‘openpyxl’)
df2 = pd.read_excel(table2_path, engine=‘openpyxl’)

print(f"表格1列名:{list(df1.columns)}")
print(f"表格2列名:{list(df2.columnsm.youchengcanada.com  wap.youchengcanada.com  tsl.youchengcanada.com  nba.youchengcanada.com  zb.youchengcanada.com)}")
print(f"关键字段:{key_column}")

# 横向合并(默认内连接,只保留关键字段匹配的行)
# 合并方式可选:how='inner'(内连接)、'left'(左连接)、'right'(右连接)、'outer'(全连接)
merged_df = pd.merge(
    df1, df2,
    on=key_column,  # 按关键字段合并
    how='left',     # 左连接:保留表格1的所有行,匹配表格2的数据
    suffixes=('_表1', '_表2')  # 列名重复时添加后缀区分
)

# 处理缺失值(可选,根据需求调整)
# 填充数值型缺失值为0,字符串型缺失值为空字符串
merged_df = merged_df.fillna({
    col: 0 if merged_df[col].dtype in ['tb.jjyk.net  gzbxtcm.com  www.gzbxtcm.com  m.gzbxtcm.com ', 'float64'] else '' 
    for col in merged_df.columns
})

# 保存结果
merged_df.to_excel(output_file, index=False, engine='openpyxl')
print(f"\n合并完成!结果已保存至:{output_file}")
print(f"合并后数据总行数:{wap.gzbxtcm.com  tsl.gzbxtcm.com  nba.gzbxtcm.com  zb.gzbxtcm.com (merged_df)},总列数:{len(merged_df.columns)}")

------------------- 调用函数 -------------------

if name == “main”:
# 替换为你的表格路径
table1 = “客户基本信息表.xlsx” # 包含列:客户ID、客户姓名、联系方式
table2 = “客户订单表.xlsx” # 包含列:客户ID、订单编号、订单金额、下单时间
key = “客户ID” # 共同关键字段
output = “客户信息+订单合并表.xlsx”

merge_different_structure_tables(table1, table2, key, output)

关键说明
pd.merge()的how参数:
inner(默认):只保留两个表格中关键字段都存在的行;
left:保留第一个表格的所有行,第二个表格无匹配数据则填充为缺失值;
right:保留第二个表格的所有行;
outer:保留两个表格的所有行,无匹配数据则填充为缺失值;
suffixes:当两个表格有同名列时,自动添加后缀区分(如 “金额_表 1”“金额_表 2”)。
五、常见问题与解决方案

  1. 读取 Excel 时提示 “文件不存在”
    检查文件路径是否正确(相对路径需确保脚本与文件夹在同一目录,或使用绝对路径,如C:/data/表格.xlsx);
    文件名是否包含特殊字符(如中文、空格,建议简化文件名)。
  2. 合并后列名重复或混乱
    不同结构表格合并时,使用suffixes参数添加后缀;
    同结构表格合并前,先检查列名是否一致(可添加assert list(df.columns) == standard_columns验证)。
  3. 数据类型不匹配(如关键字段一个是数字,一个是文本)
    合并前统一关键字段的数据类型,示例:

将“客户ID”统一转为字符串类型

df1[‘客户ID’] = df1[‘客户ID’].astype(str)
df2[‘客户ID’] = df2[‘客户ID’].astype(str)

  1. 表格太大导致内存不足
    分块读取:使用pd.read_excel(chunksize=10000)按批次读取大文件;
    筛选列:只读取需要的列,减少内存占用,示例:
    df = pd.read_excel(file_path, usecols=[‘客户ID’, ‘订单金额’, ‘下单时间’])

六、进阶拓展:批量合并不同结构表格
如果需要合并多个不同结构但有共同关键字段的表格(如客户表 + 订单表 + 回款表),可扩展代码如下:
def batch_merge_tables(table_paths, key_column, output_file):
“”"
批量合并多个不同结构的表格(按关键字段)
:param table_paths: 表格路径列表
:param key_column: 共同关键字段
:param output_file: 输出文件名
“”"
# 读取第一个表格作为基础表格
merged_df = pd.read_excel(table_paths[0], engine=‘openpyxl’)

# 循环合并后续表格
for path in table_paths[1:]:
    df = pd.read_excel(path, engine='openpyxl')
    merged_df = pd.merge(vip.gzbxtcm.com  tt.gzbxtcm.com  tb.gzbxtcm.com  youchengcanada.com  www.youchengcanada.com, df, on=key_column, how='left', suffixes=('', f'_{os.path.basename(path)}'))

merged_df.to_excel(output_file, index=False, engine='openpyxl')
print("批量合并完成!")

调用示例

table_list = [“客户表.xlsx”, “订单表.xlsx”, “回款表.xlsx”]
batch_merge_tables(table_list, “客户ID”, “客户全量数据.xlsx”)

七、总结
Python 的pandas库让表格合并变得简单高效,无论是同结构表格的批量拼接,还是不同结构表格的关键字关联,都能通过几行代码实现自动化处理。本文介绍的两种核心场景基本覆盖了日常工作中的大部分需求,读者可根据实际情况调整代码(如添加数据清洗、筛选条件等)。
如果需要处理 CSV、CSV.gz 等其他格式的表格,只需将pd.read_excel()替换为pd.read_csv(),to_excel()替换为to_csv()即可,用法完全一致。赶紧动手试试,告别重复的手动操作吧!

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐