同一件事——按地区汇总销售额并排序——Excel 要 12 步,Python 要 3 行。 但 12 步里有 6 步是「为了能算」做的准备,Python 那 3 行同样省不掉这些准备。 真正拉开差距的不是速度,是「下次换一份表,要不要重来一遍」。
这是第 1 章的最后一篇。 前四篇讲的是「分析是什么」,这一篇讲「用什么做」——因为它决定了第 2 章要装什么。 文中的步数是按实际操作数出来的,不是估的;时间不作比较,理由在第三节说明。
一、Excel 的强项:看得见
Excel 最大的好处不是快,是每一步都看得见。分列错了,一眼就发现;数字变了,格子会变色。 第二个好处是交付方便:把文件发给同事,他能点开自己核,不需要装 Python。 第三个好处是学习成本低。会排序、会筛选、会透视表,八成日常活就干完了。
所以「数据小、做一次、要给不看代码的人」这三条同时成立时,Excel 是更优解,不是将就。
二、Python 的强项:可复用
Python 的优势集中在三件 Excel 做不到的事上:接数据库、定时跑、处理上万行。 更关键的是第四件:脚本写一次,下次换数据不用改。Excel 那 12 步得重来一遍。 所以判断标准不是「谁快」,是「这件活你会做几次」。做一次,Excel;做二十次,Python。
还有一条容易忽略:Python 的处理过程本身就是文档。同事看代码,知道每个数怎么来的。
三、步数账:12 步对 3 行
同一件事,两边各数一遍。Excel 这边:打开文件、选中金额列、数据分列、删千分位逗号、 删「元」字、处理空值、插入数据透视表、拖地区到行、拖金额到值、按值降序排、 复制结果到新表、调格式——12 步。
Python 这边:读进来、按地区分组求和、排序——3 行。 差距看着是 4 倍。 但 12 步里有 6 步是「为了能算」而做的准备(分列、去逗号、去「元」、处理空值等), 剩下 6 步才是分析本身。 这 6 步准备,Python 那边同样要做,只是写成了代码,看着不像步骤。
四、代码短不等于流程短
有个常见的误会:看到「三行搞定」,以为流程也只要三步。不是的。 同一条流水线,用 Python 只跳过空值、不去重,汇总出来是 11,390 元。 而在上一篇里认真清洗完再算,是 8,010 元。差的 3,380 元全是重复行。
代码短只是打字少,流程一步都省不掉。清洗、去重、验证,这些活在哪个工具里都得做。 反过来说也成立:用 Excel 认真做,结果和 Python 一模一样。工具不改变方法论。
五、先学哪个
如果手上的活是「一次性、几百行、给同事看」,先别学 Python,把 Excel 用熟就够了。 如果活是「每天跑、上万行、要接数据库」,那值得花两周学 Pandas——省下的是重复劳动。 两条都占的,先学 Excel,等遇到第一件「一天做三遍」的活,再学 Python。有痛点学得最快。
第 2 章开始装环境,装的就是 Python 这一套:解释器、编辑器、Notebook、IPython。 口径说明:这一篇比的是步数和可复用性,不比秒。 同一台机器上跑一次的耗时差太小,测出来也不代表你手上的情况。
六、动手 Demo:Excel 和 Python:同一件事的步数账
先把 Excel 那边的 12 步列出来,再用 3 行 Python 做同一件事。 两组结果都打出来,顺便看看不清洗会差多少。
RAW = ["华东,1,200", "华北,980", "华南,1200元", "华东,860",
"西南,", "华北,1,050", "华南,1320", "华东,1200元",
"西南,640", "华北,980", "华南,760", "华东,1,200"]
agg = {}
for r in RAW:
a, v = r.split(",", 1)
v = v.strip().replace(",", "").replace("元", "")
if not v:
continue
agg[a] = agg.get(a, 0) + int(v)
for a, v in sorted(agg.items(), key=lambda x: -x[1]):
print("%s %d 元" % (a, v))
print("合计 %d 元" % sum(agg.values()))
clean = {}
seen = set()
for r in RAW:
a, v = r.split(",", 1)
v = v.strip().replace(",", "").replace("元", "")
if not v or (a, int(v)) in seen:
continue
seen.add((a, int(v)))
clean[a] = clean.get(a, 0) + int(v)
print("清洗后合计 %d 元" % sum(clean.values()))
实跑输出:
--------------------------------------------------------------------
Excel 和 Python:同一件事的步数账
--------------------------------------------------------------------
① 同一件事,两种干法
--------------------------------------------------------------------
任务:把 12 行地区销售数据按地区汇总,再按金额从大到小排。
Excel 的干法,一步一步数:
1. 打开文件
2. 选中金额列
3. 数据→分列
4. 删掉千分位逗号
5. 删掉「元」字
6. 处理空值
7. 插入数据透视表
8. 拖地区到行
9. 拖金额到值
10. 按值降序排
11. 复制结果到新表
12. 调格式
一共 12 步,其中 6 步是「为了能算」而做的准备,不是分析本身。
! 手工操作的通病:准备工作占大头,而准备工作每做一次就得重做一次。
② Python 的干法
--------------------------------------------------------------------
1. 读进来(一行)
2. 按地区分组求和(一行)
3. 排序(一行)
| 地区 | 销售额(元) |
|---|---:|
| 华东 | 4,460 |
| 华南 | 3,280 |
| 华北 | 3,010 |
| 西南 | 640 |
三行下去,结果是 11,390 元。
这个数比 D003 清洗完算出的 8,010 元多了 3,380 元——因为这 3 行只跳过空值,没有去重。
! 「三行搞定」说的是代码短,不是说流程短。清洗那几步一步都省不掉,只是 Python 上手写起来快。
③ 所以该怎么选
--------------------------------------------------------------------
一周做一次、数据几百行、结果只给自己看:Excel 更快上手。
每天跑一遍、数据上万行、要给同事复用:Python 省下来的不是时间,是「重做」的次数。
! 口径说明:这里比的是步数与可复用性,不比秒。
同一台机器上跑一次的时间差太小,测出来也不代表你手上的情况。
④ 手上的活到底属于哪一类
--------------------------------------------------------------------
| 情况 | 更适合 | 原因 |
|---|---|---|
| 一次性、数据小 | Excel | 学会 Python 的时间比省下的时间多 |
| 重复、数据大 | Python | 脚本写一次,以后每次都是一行命令 |
| 要给别人看过程 | Excel | 对方能点开自己核 |
| 要接数据库、定时跑 | Python | 这些事 Excel 做不了 |
! 第 2 章开始装环境。装之前先想清楚自己手上是哪一类活,别为了学而学。
前半段是「3 行」的真实版本——用循环写,比 Pandas 的 groupby 长,但不装任何库就能跑。
两段合起来说明一件事:代码短的是写法,不是流程。
第二段加的去重逻辑,在 Excel 里对应的是「删除重复项」那一步,一步也免不掉。
30 秒实验
- 把 RAW 里的「华东,1,200」改成「华东,1200」,去重结果会变吗?为什么?
- 如果要按「地区 + 金额区间」两列汇总,Excel 要几步?Python 要几行?
- 想一想:为什么本文反复强调「不比秒」?什么情况下比秒才是有意义的?
常见误区
- 为了学而学:手上活一年做两次、每次几百行,学 Python 的时间比省下的多。
- 以为代码短就省事:清洗、去重、验证一样不少,只是换了个写法。
- 拿跑一次的耗时做比较:单次耗时受数据量、机器、缓存影响,说明不了长期成本。
- 只会在 Notebook 里点运行:脚本要能一行命令跑起来,才算真正可复用。
自测三问(点开对答案)
1. 12 步里有 6 步是准备,这 6 步在 Python 里去哪了? —— 变成代码里的几行了。它们没消失,只是从「点鼠标」变成「写语句」,所以看着不像步骤。 2. 为什么说不清洗会多出 3,380 元? —— 因为 3 行重复记录被重复计入合计,而空值那一行本来就没有金额,剔不剔都不影响。 3. 判断该用哪个工具,最该问的一个问题是什么? —— 这件活你会做几次。做一次用 Excel,做二十次写脚本。第 1 章到此结束。 第 2 章开始动手:装 Python、装编辑器、装 Notebook,把「能跑一行代码」这件事先解决掉。
- ☐ (本篇完,下一篇 2.1 Python 是什么、版本怎么选)