python实现合并表格
Python高效合并Excel表格的两种方法 本文介绍使用Python的pandas库合并Excel表格的两种核心场景: 同结构表格纵向拼接:适用于列名相同的多表合并(如销售报表),通过pd.concat()实现批量合并,自动处理文件读取、数据拼接和去重。 不同结构表格横向关联:通过关键字段(如客户ID)合并异构表格,利用pd.merge()支持内连接、左连接等模式,处理列名冲突与缺失值。 优势:
一、前言:为什么用 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”)。
五、常见问题与解决方案
- 读取 Excel 时提示 “文件不存在”
检查文件路径是否正确(相对路径需确保脚本与文件夹在同一目录,或使用绝对路径,如C:/data/表格.xlsx);
文件名是否包含特殊字符(如中文、空格,建议简化文件名)。 - 合并后列名重复或混乱
不同结构表格合并时,使用suffixes参数添加后缀;
同结构表格合并前,先检查列名是否一致(可添加assert list(df.columns) == standard_columns验证)。 - 数据类型不匹配(如关键字段一个是数字,一个是文本)
合并前统一关键字段的数据类型,示例:
将“客户ID”统一转为字符串类型
df1[‘客户ID’] = df1[‘客户ID’].astype(str)
df2[‘客户ID’] = df2[‘客户ID’].astype(str)
- 表格太大导致内存不足
分块读取:使用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()即可,用法完全一致。赶紧动手试试,告别重复的手动操作吧!
更多推荐

所有评论(0)