夜雨聆风学习资料网

ARTICLE · 1081151

Python办公自动化—— 操作 Excel 数据实战:清洗、筛选、透视、关联 4 板斧

Python办公自动化—— 操作 Excel 数据实战:清洗、筛选、透视、关联 4 板斧
Python 办公自动化 · 第 3 篇Python 操作 Excel 数据实战:清洗、筛选、透视、关联 4 招

配图由 AI 生成 · 仅作视觉示意

本篇你将 get 到

① 数据处理主力:pandas
② 第一招:清洗(去重、去符号、转类型)
③ 第二招:筛选与排序

内容摘要

从系统导出的 Excel 往往一团乱:重复行、空值、金额带¥符号、日期是字符串。手动筛选去重、VLOOKUP 关联,一下午就搭进去了。本篇用 pandas 几行代码把脏数据洗成干净报表,覆盖清洗、筛选排序、分组统计、关联匹配四大高频操作,并点出 6 个最容易翻车的坑。

1.数据处理主力:pandas
重点:读写样式用 openpyxl(见上篇),算数据、洗数据用 pandas。
上篇说过,openpyxl 管"单元格长什么样",pandas 管"数据怎么算"。本篇四个操作全是 pandas 的强项。先读进来:

import pandas as pd

df = pd.read_excel("脏数据.xlsx", engine="openpyxl")  # 读 xlsx 必须指定引擎

print(df.shape, df.columns)        # 先看几行几列、列名叫啥

df 是一张二维表,行叫 index、列叫 columns。后面所有操作都围着它转。
2.第一招:清洗(去重、去符号、转类型)
正确:先洗再算,脏数据直接算会全程带坑。
脏表三大常见病:重复行、数字带符号、日期是文本。逐个治:

df = df.drop_duplicates()                                  # 去重

df["金额"] = (df["金额"].astype(str)

              .str.replace("¥", "", regex=False)

              .str.replace(" ", "", regex=False)

              .astype(float))                               # 去符号转数字

df["日期"] = pd.to_datetime(df["日期"], errors="coerce")   # 文本转日期,转不了的变 NaT

df = df.dropna(subset=["客户"])                             # 丢空客户行

errors="coerce" 很关键:转不了的日期不会报错崩掉,而是变成 NaT,你后面再决定是丢还是填。洗完一行 df.to_excel("干净.xlsx", index=False) 就存回去了。
3.第二招:筛选与排序
停下来想一想:你常用的"筛选"条件,用代码其实就一行。
Excel 里点筛选器做的事,pandas 里是布尔索引:

hot = df[df["金额"] > 1000]                         # 单条件:金额大于 1000

vip = df[(df["地区"] == "华北") & (df["金额"] > 5000)]  # 多条件用 & 连接

top = df.sort_values("金额", ascending=False).head(10)  # 金额降序取前 10

注意多条件用 &(且)、|(或),每个条件要加括号。排序 ascending=False 是降序,默认升序。
4.第三招:分组统计
重点:Excel 的数据透视,pandas 里就是 groupby。
"各部门销售额合计""各月平均值"这种活,不用手动求和:

by_dept = df.groupby("部门")["金额"].sum()          # 各部门金额合计

monthly = df.groupby(["年份", "月份"])["金额"].mean()  # 多键分组,月度均值

groupby 后接聚合函数(sum/mean/count/max)就是要算的指标。想看多指标就传字典:df.groupby("部门").agg({"金额":"sum","数量":"mean"})。
5.第四招:关联匹配(替代 VLOOKUP)
正确:跨表按主键关联,用 merge,比 VLOOKUP 稳还不会错位。
订单表只有客户 ID,要带上客户名和地区?VLOOKUP 容易拖错列,pandas 一行搞定:

orders = pd.read_excel("订单.xlsx", engine="openpyxl")

cust = pd.read_excel("客户.xlsx", engine="openpyxl")

merged = orders.merge(cust, on="客户ID", how="left")   # 按客户ID左关联

how="left" 表示保留左表(订单)全部行,右表匹配不上的留空。主键列名两边一致用 on,不一致用 left_on / right_on。
6.进阶:一行出透视表
pivot_table 就是 Excel 透视表的代码版,还能直接存回 xlsx。
行、列、值、算法一次给齐,多维汇总一行出:

pv = pd.pivot_table(df, values="金额",

                    index="部门", columns="月份",

                    aggfunc="sum", fill_value=0)

pv.to_excel("部门月度透视.xlsx")        # 直接存成一张透视表

fill_value=0 把空单元格填 0,不然 NaN 看着闹心。index 是行、columns 是列,想换维度改这两个参数就行。
7.6 个最容易翻车的坑
pandas 不报错不代表算对了,类型错了它也会默默给你 NaN。
1. 读 xlsx 不写引擎:新版 pandas 不再内置,必须 engine="openpyxl",否则直接报错。
2. 写出多一列:to_excel 默认把索引写成第一列(Unnamed:0),记得加 index=False。
3. 数字列读成文本:带符号或空格时 pandas 会存成 object,算之前先 .astype(str) 清符号再转 float。
4. 空值偷偷污染结果:对含 NaN 的列求和会得 NaN,先 dropna() 或 fillna(0) 再算。
5. 多条件筛选用 and 报错:pandas 要用位运算 & / |,且每个条件加括号,不能用 Python 的 and。
6. 中文路径读不出:Python 3 默认 UTF-8 没问题,但路径含中文时务必带 engine="openpyxl",别用老式写法。
停下来想一想:这 6 个坑你中过几个?卡在哪条,评论区说,我挑典型的下篇拆解。
✍️ 小结
洗数据用 drop_duplicates / astype / to_datetime / dropna
筛选是布尔索引,多条件用 &| 并加括号
分组统计 groupby + 聚合,等价于数据透视
跨表关联用 merge,比 VLOOKUP 稳
透视表 pivot_table 一行出,多维汇总直接存 xlsx
守住六坑:引擎、index=False、类型、空值、位运算、中文路径
点个「在看」鼓励一下
💬 评论区聊两句

你在使用中踩过什么坑?或者对今天的内容有不同看法?欢迎在评论区聊聊,咱们一起讨论 👇

#Python#办公自动化#Excel#pandas#Python办公自动化
本系列还有

01 Python 办公自动化实战:6 步流程让重复工作自动跑
02 Python 操作 Excel 实战:4 个场景把报表活交给脚本

本文为个人经验整理,仅供参考。代码以 Python 3.11 + pandas 2.x + openpyxl 3.x 为准。

相关学习资料