还在手动复制粘贴12个Excel文件?Python一行代码帮你合成一张年表!
一、先看这个真实痛点
刘主任每个季度末都要做这件事:
以前他得:
3个文件还能忍,如果是12个月的文件呢?30个班级的数据呢?
二、Python的"合并魔法"
今天教你4行代码,合并任意多个Excel文件:
import pandas as pdimport os# 1. 读取文件夹里所有的Excel文件文件夹 = '各月工作总结'所有文件 = [f for f in os.listdir(文件夹) if f.endswith('.xlsx')]# 2. 魔法开始!合并所有文件合并数据 = pd.concat([pd.read_excel(f'{文件夹}/{文件}') for 文件 in 所有文件])# 3. 保存结果合并数据.to_excel('全年工作总结.xlsx', index=False)print(f"✅ 搞定!已合并{len(所有文件)}个文件,共{len(合并数据)}条记录!")
看懂这个魔法了吗?
三、分解"魔法":每行代码在干什么?
3.1 第1步:找到要合并的文件
import os所有文件 = [f for f in os.listdir('各月工作总结') if f.endswith('.xlsx')]
分解理解:
- os.listdir('各月工作总结'):列出文件夹里所有文件名
- if f.endswith('.xlsx'):只保留.xlsx结尾的文件
- [f for f in ...]:把符合条件的文件名放进一个列表
比如文件夹里有:1月.xlsx、2月.xlsx、3月.xlsx...
这个代码就会得到:['1月.xlsx', '2月.xlsx', '3月.xlsx', ...]
3.2 第2步:核心魔法 pd.concat()
合并数据 = pd.concat([pd.read_excel(f'{文件夹}/{文件}') for 文件 in 所有文件])
这是今天最重要的魔法!我们拆开看:
# 第一步:读取每个文件数据列表 = []for 文件 in 所有文件: 数据 = pd.read_excel(f'{文件夹}/{文件}') # 读取一个文件 数据列表.append(数据) # 加到列表里# 第二步:合并所有数据合并数据 = pd.concat(数据列表) # 这才是魔法!
pd.concat() 的神奇之处:
3.3 第3步:保存结果
合并数据.to_excel('全年工作总结.xlsx', index=False)
- index=False:不保存行号(让Excel更干净)
四、自己动手试试!
4.1 第一步:创建测试数据
我们来模拟3个部门的数据:
import pandas as pd# 创建3个部门的测试数据部门1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'],'部门': ['技术部', '技术部', '技术部'],'任务量': [15, 12, 18],'完成率': [95, 88, 92]})部门2 = pd.DataFrame({'姓名': ['赵六', '钱七'],'部门': ['市场部', '市场部'], '任务量': [20, 16],'完成率': [85, 90]})部门3 = pd.DataFrame({'姓名': ['孙八', '周九', '吴十'],'部门': ['行政部', '行政部', '行政部'],'任务量': [8, 10, 9],'完成率': [98, 95, 96]})print("📋 部门1数据:")print(部门1)print("\n📋 部门2数据:") print(部门2)print("\n📋 部门3数据:")print(部门3)
运行后看到3个独立表格。
4.2 第二步:使用合并魔法
# 把3个部门数据放进一个列表所有部门 = [部门1, 部门2, 部门3]# 使用合并魔法!全公司数据 = pd.concat(所有部门)print("\n🎯 合并后的全公司数据:")print(全公司数据)print(f"\n✅ 合并成功!总计{len(全公司数据)}位员工")
运行结果:
姓名 部门 任务量 完成率0 张三 技术部 15 951 李四 技术部 12 88 2 王五 技术部 18 920 赵六 市场部 20 851 钱七 市场部 16 900 孙八 行政部 8 981 周九 行政部 10 952 吴十 行政部 9 96
看到了吗?
只用1行 pd.concat(),完成了表格合并!
五、办公实战:合并12个月的数据
5.1 创建12个月的模拟数据
# 生成12个月的销售数据月份数据 = []for 月 in range(1, 13): 月份表 = pd.DataFrame({'月份': [f'{月}月'] * 5, # 每月份5条记录'产品': [f'产品{i}'for i in range(1, 6)],'销售额': [100 + 月*10 + i*5 for i in range(5)] # 模拟销售额 }) 月份数据.append(月份表)# 合并全年数据全年销售 = pd.concat(月份数据)print("📅 全年销售数据(前20条):")print(全年销售.head(20))print(f"\n📊 总记录数:{len(全年销售)}条")
5.2 合并时添加标识列
# 更高级的合并:给每个文件添加来源标识部门数据 = []部门名 = ['技术部', '市场部', '行政部']for i, 部门 in enumerate([部门1, 部门2, 部门3]): 部门 = 部门.copy() # 复制一份,避免修改原数据 部门['数据来源'] = f'{部门名[i]}_2023'# 添加标识列 部门数据.append(部门)# 合并带标识的数据标识数据 = pd.concat(部门数据)print("\n🏷️ 带数据来源标识的合并结果:")print(标识数据)
六、更多实用合并技巧
6.1 合并列名不同的表格
# 有时候表格列名不完全相同表1 = pd.DataFrame({'姓名': ['张三'], '年龄': [25]})表2 = pd.DataFrame({'姓名': ['李四'], '工龄': [3]}) # 列名不同!# 合并时如何处理?合并结果 = pd.concat([表1, 表2], sort=False)print("📋 列名不同的表格合并:")print(合并结果)print("\n说明:不同列名会变成新列,没有的值用NaN填充")
6.2 横向合并(类似Excel的VLOOKUP)
# 学生基本信息表学生信息 = pd.DataFrame({'学号': ['S001', 'S002', 'S003'],'姓名': ['小明', '小红', '小刚'],'班级': ['三(1)班', '三(1)班', '三(2)班']})# 学生成绩表 学生成绩 = pd.DataFrame({'学号': ['S001', 'S002', 'S003'],'语文': [85, 92, 78],'数学': [92, 88, 85]})# 横向合并(按学号匹配)完整信息 = pd.merge(学生信息, 学生成绩, on='学号')print("\n👥 横向合并学生信息和成绩:")print(完整信息)
pd.merge() 相当于Excel的VLOOKUP:
6.3 合并文件夹里所有CSV文件
import glob # 另一种查找文件的方法# 找到文件夹里所有CSV文件csv文件列表 = glob.glob('数据文件夹/*.csv')# 合并所有CSVcsv数据 = pd.concat([pd.read_csv(文件) for 文件 in csv文件列表])print(f"📂 已合并{len(csv文件列表)}个CSV文件")
七、重点总结:今天你学会了什么?
✅ 核心技能
- pd.concat([表1, 表2, 表3]) - 纵向合并多个表格
- pd.merge(表1, 表2, on='列名') - 横向合并(类似VLOOKUP)
- os.listdir('文件夹') - 获取文件夹里所有文件名
- glob.glob('*.csv') - 按模式查找文件
✅ 办公应用场景
✅ 效率对比
八、今日挑战:动手做!
任务1:合并你的第一个表格
# 创建两个测试表格表A = pd.DataFrame({'城市': ['北京', '上海'],'人口': [2189, 2487] # 万})表B = pd.DataFrame({'城市': ['广州', '深圳'],'人口': [1881, 1756]})# 你的任务:合并这两个表格# 在这下面写你的代码:print("合并结果:")print(合并表)
任务2:合并带标识的数据
# 创建季度数据一季度 = pd.DataFrame({'产品': ['A'], '销量': [100]})二季度 = pd.DataFrame({'产品': ['A'], '销量': [120]})# 任务:合并时添加"季度"列一季度['季度'] = 'Q1'# 示例# 二季度也添加季度标识,然后合并print("带季度的合并结果:")print(结果)
任务3(进阶):合并文件夹模拟
# 模拟创建3个文件(不用真实文件)文件1 = pd.DataFrame({'月': ['1月'], '数据': [100]})文件2 = pd.DataFrame({'月': ['2月'], '数据': [200]})文件3 = pd.DataFrame({'月': ['3月'], '数据': [300]})文件列表 = [文件1, 文件2, 文件3]# 任务:合并这三个"文件"# 提示:用pd.concat()print(f"合并了{len(文件列表)}个文件,总记录数:{len(合并结果)}")
九、明日预告
明天学数据分组统计!
告别分类汇总,Python分组更强大!
回复"Py-Day"查看挑战题答案和完整代码。
特别提醒:合并操作在工作中非常常用!一定要掌握!
评论区作业:分享你工作中需要合并表格的场景,或者晒出你的合并代码截图!👇