尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python批量处理Excel:从合并、清洗到拆分的一站式实践

Python批量处理Excel:从合并、清洗到拆分的一站式实践 别再手动处理 Excel 了Python 一行代码批量搞定效率直接拉满真正让我下定决心彻底转用 Python 处理 Excel是有一次月底要合并 47 个分公司的报表。当时我打开第一个工作簿新建一个汇总表复制、粘贴、调整列宽……做到第 9 个文件的时候就已经头昏眼花做到第 23 个文件的时候复制错了行整个汇总表数据全乱又得从头再来。那天晚上我在朋友圈发了一句“Excel 手动处理真的会死人的”底下有个前同事回了一句“用 pandas 的 concat三行代码的事。”那是三年前从那以后凡是遇到批量、重复、规则固定的 Excel 操作我再也没手动干过。如果你也经常被 Excel 里的重复劳动折磨比如合并几十个表格、清洗乱七八糟的数据、在两张表之间匹配信息、拆分一个大数据表那今天这篇内容就是写给你的。我会从实际项目出发把我这三年来最常用、最能提升效率的 Python 批处理 Excel 方案全部拆开讲清楚包括“一行代码”背后的原理、环境怎么装、代码怎么改、坑在哪里一次讲完。1. 手动处理的痛点与“一行代码”的真实含义1.1 那些年我们手动处理 Excel 的崩溃瞬间手动批量处理 Excel 最折磨人的不是操作本身而是操作的重复性。你做的每个动作——复制、粘贴、筛选、删除空行、调整格式——单独拿出来都不难但乘以 47 个文件、乘以每个月一次、乘以每年 12 次那种枯燥感会被无限放大。更要命的是手动操作很容易出细节错误。做过报表的人应该都有这种经历粘贴的时候少选了一行VLOOKUP 的时候引用范围没加绝对引用筛选的时候不小心把隐藏行一起删了。这些错误往往在提交之后才被发现然后又是一轮返工。我归纳了一下手动处理 Excel 最让人崩溃的场景基本集中在四类多文件合并几十个结构相同的分表要汇总到一个总表里。数据清洗某个列里混着空格、换行符、全角半角混用或者明明看着是数字却存成了文本。表间匹配两张表用某个关键字段关联手动 VLOOKUP 列一多就卡还容易引错列。批量拆分/生成一个总表按部门、按月份拆成多个子表或者反过来批量生成同格式报表。这四类场景共同的特点是规则明确、重复性高、人工操作极易出错。而这恰恰是 Python 最擅长处理的事情。1.2 “一行代码”不是魔法而是语法糖加库的威力标题里说的“一行代码”我知道很多人会觉得是标题党。实际上这个说法要分开看。如果你说“一行代码搞定一切”那当然是夸张。但 Python 这种语言本身的语法设计加上 pandas、openpyxl 这类专门处理表格的库确实能把很多原本需要几十步手工操作的事情压缩到一行表达式里。比如合并目录下所有 Excel 文件的核心代码核心逻辑真的只有一行pd.concat(dfs)前面的遍历和读取也只是两三行准备工作。“一行代码”的本质是把复杂的逻辑封装成了函数和方法的调用。你不需要关心 pandas 底层是怎么解析 xlsx 文件的你只需要知道read_excel()是读表、concat()是拼接、to_excel()是输出。这就是库的威力别人把成千上万行的底层实现写好你在上面做乐高式的拼接。所以这篇文章里我讲的“一行代码”准确说是**“单个核心操作的代码”**围绕它你会看到完整的三五行上下文。这并不影响效率的提升恰恰因为核心逻辑足够简洁你才有精力去关注数据本身而不是被代码细节淹没。1.3 为什么是 Python而不是 VBA 或者 WPS 自带功能每次讲到用 Python 处理 Excel总有人问Excel 自带的 VBA 不也能做吗Power Query 不也能合并表吗WPS 也有批量操作功能为什么还要单独学 Python我的回答是看你面对的问题有多大的“量”和“变”。VBA 和 Excel 内置功能在处理单个文件内的复杂操作时确实方便但如果你的数据散落在几百个文件中或者你需要先下载文件、处理完再改名归档甚至要对接数据库、调用接口、定时运行VBA 的局限性就出来了。VBA 和 Excel 是绑死的离开 Excel 环境就跑不了而且写起来和调试起来的体验用过的都知道。Python 的优势在于它是个通用工具。同样一套 pandas 语法你今天处理 Excel明天可以处理 CSV后天可以处理数据库查询结果。而且 Python 脚本可以交给计划任务定时跑可以放到服务器上跑完全不依赖你电脑上有没有装 Office。我后来甚至用 Python 直接把处理结果通过邮件发出去整个流程全自动Excel 连打开都不用打开。当然这并不意味着 VBA 一无是处。我的态度是重度 Excel 用户可以把 VBA 当作补充但批处理、自动化、跨系统整合的场景Python 是更值得投入的方向。2. 环境准备装对工具后面才不踩坑2.1 Python 安装与三个必装库这一步看起来基础但我见过太多人卡在这里。说几个关键点。第一个是 Python 本身的安装。去 Python 官网下载安装包的时候注意安装界面上有一个Add Python to PATH的选项默认是不勾选的一定要手动勾上。很多新手装完之后在命令行敲python提示“不是内部或外部命令”十有八九就是这里没勾。如果已经装完了才发现没勾也可以手动把 Python 的安装路径加到系统环境变量里不过新手直接重装一遍勾上更方便。第二个是库的安装。处理 Excel 最核心的三个库分别是pandas数据处理的核心库读写 Excel、合并、清洗、匹配全靠它。openpyxlpandas 读写 xlsx 文件时的底层引擎单独安装以防万一。xlrd/xlsxwriterxlrd 用来读取老版 xls 文件xlsxwriter 用来写入带格式的 xlsx 文件。安装命令很简单打开命令行执行pip install pandas openpyxl xlrd xlsxwriter如果你网络环境一般可以加国内镜像源速度快很多pip install pandas openpyxl xlrd xlsxwriter -i https://pypi.tuna.tsinghua.edu.cn/simple装完之后确认一下版本。不同版本的 pandas 在 API 上会有点细微差别老教程里的代码在新版本上可能会报警告但基本不影响运行。可以用这个命令看版本python -c import pandas as pd; print(pd.__version__)2.2 文件路径与工作目录的坑新手最容易忽略环境装好之后写代码遇到的第一个“隐形坑”就是文件路径。很多新手会这样写pd.read_excel(D:\数据\销售报表.xlsx)然后报错。原因很简单\在 Python 字符串里有转义含义\数会被解析成奇怪的字符路径就认不出来了。解决方案有三种把反斜杠改成正斜杠D:/数据/销售报表.xlsx在字符串前面加r前缀rD:\数据\销售报表.xlsx把反斜杠写成双反斜杠D:\\数据\\销售报表.xlsx我个人的习惯是写代码的时候直接用相对路径把待处理的 Excel 文件放在和脚本同一个文件夹下。这样既不用纠结路径分隔符的问题换电脑换目录也方便。比如合并同目录下所有 Excel 文件我用的是import glob files glob.glob(*.xlsx)glob是 Python 自带的文件通配符匹配模块*.xlsx表示“当前目录下所有以 .xlsx 结尾的文件”。这样写出来的脚本不管文件夹放在哪里都能直接跑不需要改任何路径。另外说一个小习惯开始写处理脚本之前先用os.chdir()把工作目录切到文件所在目录或者在代码开头用os.getcwd()打印一下当前目录确认位置。这个习惯帮我省了很多次“文件找不到”的排查时间。3. 第一类批量场景多表合并与多文件遍历3.1 一个工作簿中合并多个 Sheet日常工作里最常遇到的场景之一一个 Excel 文件里有 12 个 Sheet分别是一月到十二月的销售数据你要把它们合并成一张总表。手动操作的话你需要新建一个汇总 Sheet然后一个一个复制粘贴。如果 12 个 Sheet 结构一模一样还好如果某个 Sheet 列顺序不一样、或者中间多了一列手动复制的时候很容易错位。用 pandas 处理这个场景核心代码是这样的import pandas as pd # 读取整个 Excel 文件sheet_nameNone 表示读取所有 Sheet sheets pd.read_excel(2024年销售数据.xlsx, sheet_nameNone) # 所有 Sheet 的数据合并成一个大 DataFrame df pd.concat(sheets.values(), ignore_indexTrue) # 输出汇总结果 df.to_excel(2024年销售数据_汇总.xlsx, indexFalse)这段代码里的核心就一行pd.concat(sheets.values(), ignore_indexTrue)。sheets是一个字典key 是 Sheet 名value 是对应的 DataFramesheets.values()取出所有数据concat把它们按行拼接起来。ignore_indexTrue这个参数很多人会漏它的作用是忽略每个 Sheet 自带的索引重新生成一个 0 到 N-1 的连续索引。如果漏掉这个参数最后合并出来的表里会保留每个 Sheet 的原始行号看起来就像多了一列没意义的序号后续筛选或透视的时候容易搞混。3.2 批量合并同目录下所有 Excel 文件比合并 Sheet 更常见的是合并多个独立的 Excel 文件。比如各分公司发来 47 个报表文件名分别是“华东分公司_2024年12月.xlsx”“华南分公司_2024年12月.xlsx”这样的格式需要汇总成一张总表。我之前踩过一个坑一开始我用pd.read_excel(files[0])先读取第一个文件获取列名然后写个 for 循环一个个读取再拼接。后来发现直接concat一行就能搞定import pandas as pd import glob # 获取所有目标 Excel 文件 files glob.glob(分表_*.xlsx) # 循环读取每个文件并筛掉全空的 Sheet dfs [] for f in files: df pd.read_excel(f) if not df.empty: dfs.append(df) # 核心一行代码合并所有数据 merged pd.concat(dfs, ignore_indexTrue) merged.to_excel(全部分公司汇总.xlsx, indexFalse)这里值得展开讲一下glob.glob(分表_*.xlsx)的妙用。*是通配符代表任意字符所以它能匹配出所有以“分表_”开头、以“.xlsx”结尾的文件。如果你只想合并 12 个月的数据也可以写glob.glob(*2024*.xlsx)只匹配文件名里带 2024 的文件非常灵活。如果你担心某些分公司发来的表里可能有空 Sheet 或者空数据if not df.empty这层判断可以帮你过滤掉。一开始没加这个判断的时候合并出来的表里偶尔会出现一整行空的 NaN 数据排查了半天才发现是某个分公司的模板里有隐藏 Sheet。3.3 保留表头信息从文件名中提取关键字段上面那个合并例子有个实际业务中常遇到的问题合并完之后你只知道数据汇总到一起了但看不出每一行数据到底来自哪个分公司。如果各分公司报表里本身没有“公司名称”这一列你就得想办法把文件名里的信息补进去。我常用的做法是在循环里把文件名作为一列加到数据里import pandas as pd import glob import os files glob.glob(分表_*.xlsx) dfs [] for f in files: df pd.read_excel(f) # 从文件名里提取公司名比如 分表_华东分公司.xlsx 提取出 华东分公司 filename os.path.basename(f) # 去掉路径只留文件名 company filename.replace(分表_, ).replace(.xlsx, ) # 去掉前后缀 df[来源公司] company # 新增一列写入公司名 dfs.append(df) merged pd.concat(dfs, ignore_indexTrue) merged.to_excel(全部分公司汇总.xlsx, indexFalse)os.path.basename()是个很实用的小工具它能把完整路径里最后的文件名部分取出来。配合字符串的replace()方法就能轻松从文件名里解析出各种业务字段。这个方法我用了无数次合并报表、汇总日志、整理导出数据都用得上。4. 第二类批量场景数据清洗与表间匹配4.1 批量去重、缺失值处理与格式统一原始数据从来不会像模板那么干净。各种系统导出的 Excel要么名字里有空格要么列里有空值要么手机号被 Excel 自动变成了科学计数法要么日期格式五花八门。手动清洗这些数据是最磨人的因为数据量一大你就不知道哪里脏、哪里不脏全凭肉眼一个个看。pandas 处理这类问题非常高效。我挑几个最高频的场景结合代码说明。批量去重import pandas as pd df pd.read_excel(客户名单.xlsx) # 按“客户ID”列去重保留第一条记录 df_cleaned df.drop_duplicates(subset[客户ID], keepfirst)这一行代码就相当于你在 Excel 里点击“删除重复项”但它可以在成百上千行数据上瞬间完成。subset参数指定按照哪些列判断重复keepfirst表示保留重复项中的第一条。如果你想去重后保留最后一条改成keeplast即可。缺失值处理# 删除某列为空的行 df_cleaned df.dropna(subset[订单金额]) # 用 0 填充所有空值 df_filled df.fillna(0) # 用该列的平均值填充常用于数值型指标 df[销量] df[销量].fillna(df[销量].mean())这里我给个实用建议处理缺失值之前先搞清楚空值的业务含义。空值在有些场景里代表“无”可以直接填 0在有些场景里代表“未知”填 0 会扭曲统计结果。我之前有一次用 0 填充了应收账款里的空值月底对账时发现总额跟财务系统对不上排查半天才发现这个逻辑问题。数据清洗的每个决策都要知道自己在干什么。格式统一# 把“手机号”列统一转成字符串去掉里面的横线和空格 df[手机号] df[手机号].astype(str).str.replace(-, ).str.strip() # 把日期列统一格式 df[下单日期] pd.to_datetime(df[下单日期]).dt.strftime(%Y-%m-%d)这里第一行代码特别实用。Excel 里超过 11 位的数字会自动显示成科学计数法比如138****1234这种手机号看着正常但用系统导出后可能变成1.38123E09用astype(str)先把数值转成字符串再做字符串替换和清洗就能彻底解决。4.2 一行代码式的类 VLOOKUP 匹配在 Excel 里做两表匹配大多数人的第一反应是 VLOOKUP 函数。数据量小的时候没问题数据量一大公式一拖几千行Excel 就会开始卡。而且 VLOOKUP 函数本身有几个隐蔽问题查找列不是第一列时容易出错查不到的值返回#N/A得嵌套 IFERROR 处理两个表字段名不一致时公式也容易引错。pandas 中的merge就是 VLOOKUP 的替代方案核心一行代码import pandas as pd # 订单表包含 客户ID、订单号、金额 orders pd.read_excel(订单表.xlsx) # 客户表包含 客户ID、客户姓名、客户等级 customers pd.read_excel(客户表.xlsx) # 核心一行代码按客户ID关联两张表 merged pd.merge(orders, customers, on客户ID, howleft) merged.to_excel(订单_带客户信息.xlsx, indexFalse)howleft对应的是 Excel VLOOKUP 的“以左边表为主”的逻辑左边表订单表的所有行都保留右边表客户表根据客户ID匹配信息匹配不到就填空值。这个逻辑和我们平时用的 VLOOKUP 是一致的但运行速度快的多几千行数据秒出结果。如果两个表里的关联字段名称不一致一个叫“客户ID”一个叫“客户编号”可以通过left_on和right_on指定merged pd.merge(orders, customers, left_on客户ID, right_on客户编号, howleft)匹配完之后你可能会发现结果里多了一列“客户编号”因为两个表的关联字段都保留了下来。如果只想要一列可以直接用drop删掉merged merged.drop(columns[客户编号])merge匹配还有个比 VLOOKUP 强的地方它可以一次关联多列也可以做“右连接”“全连接”“内连接”。如果你需要匹配两个以上的表merge可以链式调用pd.merge(pd.merge(t1, t2, onkey), t3, onkey)一样不复杂。5. 第三类批量场景批量生成、拆分与更新5.1 按条件把一个工作表拆分为多个独立文件合并的反方向是拆分。比如你手上有一张包含全国所有门店销售数据的明细表现在需要按门店拆成几十个文件发给各个店长。手动拆分的话你需要先筛选出门店 A 的数据、复制、新建文件、粘贴、保存然后筛选门店 B……如果有 30 家门店这活不复杂但极其耗时。Python 的处理逻辑同样清晰import pandas as pd df pd.read_excel(全国门店销售明细.xlsx) # 获取所有门店名称 stores df[门店名称].unique() # 循环按门店拆分 for store in stores: store_df df[df[门店名称] store] store_df.to_excel(f门店报表_{store}.xlsx, indexFalse)核心就是循环加筛选每个门店的数据单独存成一个文件。df[门店名称].unique()会返回这个列里的所有不同取值这样即使你事先不知道有多少家门店代码也能自动识别。文件命名上有个小技巧文件名里尽量用英文和下划线不要直接用中文门店名。原因是有些门店的名字里可能包含斜杠、星号等 Windows 文件名里不允许的字符直接写入文件名会报错。我一般会先用re.sub(r[\\/*?:|], , store)做一次文件名清洗把非法字符替换成空字符。如果拆分的条件不是“一个门店一个文件”而是“一个城市一个文件”甚至“每个月的每个门店各一个文件”只需要在筛选时多加一个条件df[(df[城市] city) (df[月份] month)]逻辑是一样的套个双层循环就行。5.2 批量读取后统一列名处理“表格结构不完全一样”的分表真实的业务环境里你可能遇到更头疼的情况几十个分表的结构并不完全一致。有的表里叫“客户名称”有的表里叫“客户名”还有的表里这列干脆叫“公司名称”。直接合并会得到一堆莫名其妙的列。这时候在合并之前加一步“列名标准化”import pandas as pd import glob # 定义列名映射规则把所有可能的叫法统一成标准列名 col_mapping { 客户名称: 客户, 客户名: 客户, 公司名称: 客户, 订单额: 金额, 销售金额: 金额, 销售额: 金额, } dfs [] for f in glob.glob(分表_*.xlsx): df pd.read_excel(f) df df.rename(columnscol_mapping) # 按映射规则改列名 dfs.append(df) merged pd.concat(dfs, ignore_indexTrue)rename(columnscol_mapping)只改列名不改变数据内容。那行映射表是整个脚本的“灵魂”你可以在里面无限扩充别名。这个思路特别适合处理“好几个系统导出却各叫各的”的脏数据多花两分钟维护映射表能省下几小时手工对列名的时间。5.3 批量修改 Excel 内数据的三种思路除了合并、拆分日常还经常会遇到“批量修改 Excel 里某些数据”的需求。比如把一个表格里所有“北京市”改成“北京”或者把所有“已支付”改成“已付款”。手动操作的话无外乎 CtrlF 一个个查找替换重复且容易漏。pandas 里最简单的替换方式df[城市] df[城市].replace(北京市, 北京)如果想同时替换多个值可以传字典df[状态] df[状态].replace({已支付: 已付款, 已完成: 已结束})如果想做更灵活的模糊匹配比如把城市列里所有含“北京”的文本统一成“北京”可以用str.contains配合布尔索引df.loc[df[城市].str.contains(北京), 城市] 北京这行代码的意思是找到“城市”列里包含“北京”两个字的行把这些行的“城市”列的值统改为“北京”。df.loc[...]是按条件定位到指定行列然后直接赋值改完之后原始数据就被替换了。这个操作在 Excel 里需要好几步筛选、选中、替换在 pandas 里一行解决。6. 高频踩坑实录如果你也碰到了这些问题6.1 读出来的数字变成科学计数法或小数精度丢失这是处理 Excel 时最常见的“事故”。Excel 文件里的数字本身没问题但用 pandas 读取后很长的数字比如订单号、身份证号、银行卡号会被读成浮点数小数部分丢失或者变成科学计数法。解决的核心思路是把这些字段从一开始就按字符串读取。read_excel有一个dtype参数可以指定列的读取类型df pd.read_excel(订单表.xlsx, dtype{订单号: str, 身份证号: str})这样读取时订单号、身份证号就会以文本格式读入不会丢精度。如果你在读取时没指定 dtype数据已经被读成浮点数了再转换回字符串时后面会带.0还得做一次替换df[订单号].astype(str).str.replace(.0, )麻烦得多。所以最好在读取时就规划好哪些列是文本型哪些是数值型。6.2 写入后 Excel 里的公式丢失、格式全乱很多人在用df.to_excel()输出结果后会发现一个问题生成的 Excel 文件里虽然数据是对的但是列宽不合理、表头没有加粗、数字不是想要的小数位数——总之就是“丑”。pandas 本身只负责写数据不负责写格式。如果你特别在意输出格式有两个方向可以选一是用xlsxwriter引擎来写。to_excel方法支持传入enginexlsxwriter然后用它的格式化功能with pd.ExcelWriter(输出.xlsx, enginexlsxwriter) as writer: df.to_excel(writer, sheet_name汇总, indexFalse) workbook writer.book worksheet writer.sheets[汇总] worksheet.set_column(A:F, 18) # 设置列宽二是先让 pandas 生成基础数据文件再用 openpyxl 打开做二次美化。不过说实话如果你的核心需求是“完成批量处理、拿到正确数据”格式问题可以放到最后统一用模板处理。我一般会把专业人员维护的 Excel 模板作为最终输出模板数据通过 pandas 写入格式在模板里已经定好省去大量调格式的时间。6.3 大文件处理慢到怀疑人生我处理过最大的一次数据是一个包含 80 万行销售明细的 xlsx 文件。直接用 pandas 读取花了 40 多秒合并操作又花了十几秒整体跑完将近一分钟。如果你的数据量同样很大有三个优化方向第一如果不是必须用 Excel 格式优先用 CSV 或 Parquet。pd.read_csv()和pd.read_parquet()的速度比read_excel快好几倍。xlsx 本身就是个压缩的 XML 包解析开销大。第二筛选后再合并。如果几十个文件里有一大半是你不需要的数据在循环读取时就用条件筛选过滤掉而不是全部读进来再 dropdf pd.read_excel(f) df df[df[状态] 已支付] # 只保留需要的数据第三用pd.concat而不是不断 append。老代码里常见的写法是df df.append(new_df)这在 pandas 2.0 之后已经移除了而且这种写法在循环里会反复复制整个 DataFrame数据量大时效率极低。正确的做法是把每次读到的 DataFrame 放进一个列表最后统一concat。6.4 路径、编码、中文乱码问题汇总最后集中说几个常见小问题。中文乱码如果读取 CSV 文件时中文乱码八成是编码问题。用pd.read_csv(文件.csv, encodinggbk)或encodingutf-8换着试。如果你的文件是 Excel 另存的 CSV一般是 GBK 编码直接用 UTF-8 读会乱码。Sheet 名带空格pd.read_excel(文件.xlsx, sheet_nameSheet 1)这种Sheet 名里有个空格很容易被忽略。建议在写sheet_name之前先用pd.ExcelFile(文件.xlsx)查看所有 Sheet 名xls pd.ExcelFile(文件.xlsx) print(xls.sheet_names)文件被占用报错Windows 系统下如果你的目标文件正在 Excel 中打开着Python 写入时会报“PermissionError”。运行脚本之前先关掉所有已打开的 Excel 文件这个小细节帮我少踩了很多坑。列表总为空如果glob.glob(*.xlsx)返回了空列表不要怀疑自己写错了先检查当前工作目录到底在哪。用os.getcwd()打印一下再用os.listdir()看看目录里有什么大概率是你把脚本放在一个目录而 Excel 文件在另一个目录。7. 一个完整的批量处理实战从一堆杂乱报表到整洁汇总表讲了这么多零散技巧最后拼装成一个完整的实战例子。假设你现在收到 12 个月的分公司报表文件名分别是“1月_华东.xlsx”“2月_华东.xlsx”……一直到“12月_华北.xlsx”每个文件里有几个 Sheet但你只需要其中名为“数据”的那个 Sheet而且每个文件里的列名还不完全一致还有一堆重复行和空值。整合后的完整脚本import pandas as pd import glob import re col_mapping { 客户名称: 客户, 客户名: 客户, 订单编号: 订单号, 销售金额: 金额, 成交金额: 金额, } dfs [] for f in glob.glob(*_*.xlsx): # 1. 读取指定 Sheet df pd.read_excel(f, sheet_name数据) # 2. 统一列名 df df.rename(columnscol_mapping) # 3. 从文件名提取月份和地区 base f.replace(.xlsx, ) month, region base.split(_) df[月份] month df[地区] region # 4. 去重、去掉关键字段为空的行 df df.drop_duplicates(subset[订单号]) df df.dropna(subset[订单号]) # 5. 金额列转数值无法转换的填 0 df[金额] pd.to_numeric(df[金额], errorscoerce).fillna(0) dfs.append(df) # 6. 合并所有数据 final pd.concat(dfs, ignore_indexTrue) # 7. 按月汇总 monthly_summary final.groupby(月份)[金额].sum().reset_index() # 8. 输出结果 final.to_excel(全年数据_明细.xlsx, indexFalse) monthly_summary.to_excel(全年数据_月度汇总.xlsx, indexFalse)这个脚本只有三十来行但完成了读取、改列名、加来源信息、去重、清洗、合并、汇总、输出一整套流程。如果手动操作我估计要两个小时用这个脚本从把文件放进文件夹到拿到结果一分钟以内。这里特别说下pd.to_numeric(df[金额], errorscoerce)这个操作。它的作用是把“金额”列强制转换成数值类型如果某一行无法转换比如里面有“N/A”或者“—这样的符号errorscoerce会把它转成 NaN再配合.fillna(0)填成 0。这比 Excel 里的“分列-固定宽度-转换”要灵活得多也是清洗脏数据最常用的一招。类似groupby(月份)[金额].sum()这种分组汇总逻辑对应 Excel 里就是“按月份分类汇总”或“透视表”。用代码写出来感觉更直接先指定按什么分组月份再指定对哪一列金额做什么统计求和一目了然。如果你想看每个地区每个月的平均金额就写final.groupby([地区, 月份])[金额].mean()统计函数换成count、max、min、median都可以逻辑完全一样。第 8 步的输出是“明细 汇总”两个文件这是我个人很推荐的输出方式。保留明细文件方便追溯每一行数据生成汇总文件方便领导直接看结论。如果后续还要更新直接把代码重新跑一遍就行永远不会出现“明明改了数据却忘了更新汇总”的尴尬。写到这里基本上我从手动处理 Excel 到 Python 批量处理这三年里最核心的经验都讲完了。这中间最深的体会是效率提升的关键往往不在于“更努力”而在于“换工具”。手动处理 Excel 并不可耻但当你发现自己第三次在做同样的事情时就该停下来想想有没有办法让机器替你做。pandas 的学习曲线并不陡峭从今天这几个例子开始复制代码、改改列名、跑通一次你就能感受到批量处理的爽感。等你会了第一个脚本后面第二个、第三个都会非常快。
返回列表