前言
Python 可以为 Excel 做些什么?如果你经历过工作簿意外崩溃、计算出错,并且需要执行枯燥的手动操作,那么肯定想知道这个问题的答案。Excel 一直是金融界的基础性工具,但是有大量的 Excel 应用程序用处不大。当 Excel 工作簿保存了太多的数据和公式时,它们就会变得越来越慢甚至崩溃,这样的事屡见不鲜。
本文介绍了 Python 与 Excel 结合使用的优势及环境配置方法,涵盖 Anaconda 安装、Conda 环境管理、Python 基础语法(数据类型、控制流、PEP 8 规范)以及 pandas 库的核心功能,包括 NumPy 数组操作、DataFrame 数据清洗、合并、统计分析及可视化等,旨在帮助 Excel 用户通过编程实现自动化数据处理与分析。

Python 可以为 Excel 做些什么?如果你经历过工作簿意外崩溃、计算出错,并且需要执行枯燥的手动操作,那么肯定想知道这个问题的答案。Excel 一直是金融界的基础性工具,但是有大量的 Excel 应用程序用处不大。当 Excel 工作簿保存了太多的数据和公式时,它们就会变得越来越慢甚至崩溃,这样的事屡见不鲜。
从 Excel 到 Python 是一种自然的过渡。虽然直接丢掉 Excel 的想法很吸引人,但 Excel 不会消失,它会作为一种用途广泛的桌面工具持续存在于企业和家庭中。本书架起了连接这两个世界的桥梁。书中解释了你应该如何将 Python 集成到 Excel 中,以及如何从躲都躲不掉的巨型工作簿、上千个公式、奇形怪状的 VBA 代码中解脱。
自动化能够避免人为错误的发生,并且能够让你把更多的时间花在更具生产力的任务上——而不是花大量时间把数据复制并粘贴到 Excel 工作表中。既然你已经知道为何 Python 可以成为 Excel 的'好伙伴',那么是时候配置好环境,开始写你的第一行 Python 代码了!
前往 Anaconda 主页下载最新版的 Anaconda 安装器(个人版,Individual Edition)。要确保下载的是 Python 3.x 版本的 64 位图形化安装器。下载完成之后,双击安装器开始安装,确保所有选项保持默认值。更详细的安装过程请参照 Anaconda 官方文档。
安装好 Anaconda 之后,就可以启动 Anaconda Prompt 开始学习了。下面来看看这是个什么东西,又是如何工作的。
Anaconda Prompt 实际上就是 Windows 中的一个命令提示符或者 macOS 中的终端,只不过它配置好了 Python 解释器和第三方包。Anaconda Prompt 是执行 Python 代码的最基本的工具,本书会大量使用它来执行 Python 脚本和各种包提供的命令行工具。
在 Anaconda Prompt 中,可以通过执行 python 命令启动一个交互式 Python 会话:
(base) C:\Users\felix>python
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [...]
:: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
macOS 终端中显示的文本可能有些不一样,但是道理都是一样的。本书是按照 Python 3.8 版本撰写的,如果你想用更新的版本,一定要看一下本书主页上的说明。
我在前面提到过 Python 的包管理器 pip,它负责下载、安装、更新和卸载 Python 包及其依赖项和子依赖项。虽然 Anaconda 也可以配合 pip 工作,但是它还有一个名为 Conda 的内置包管理器。Conda 的一大优势是不仅可以安装 Python 包,还可以安装多种版本的 Python 解释器。一言以蔽之:软件包可以为 Python 添加标准库中所没有的功能。第 5 章将介绍的 pandas 就是这样的包。由于 Anaconda Python 发行版已经预装好了这些包管理器,因此就不需要我们手动安装了。
你可能很好奇 Anaconda Prompt 每行开头的 (base) 到底是什么。它是当前激活的 Conda 环境的名称。Conda 环境是一个被隔离的'Python 世界',有着特定版本的 Python 和一系列安装好的包。为什么非要这么做呢?当你同时开发多个项目的时候,各个项目会有不同的需求:一个项目可能需要 Python 3.8 和 pandas 0.25.0,而另一个项目可能需要 Python 3.9 和 pandas 1.0.0。由于为 pandas 0.25.0 编写的代码往往需要进行修改才能用到 pandas 1.0.0 上,因此不能只更新 Python 和 pandas 而保持代码原封不动。为每个项目都配置一个 Conda 环境可以保证它们使用正确的依赖项运行。Conda 环境虽然是 Anaconda 发行版的专有概念,但虚拟环境是所有 Python 发行版的通用概念。相比之下 Conda 环境更加强大,因为它不仅可以管理多个版本的软件包,还可以轻松管理不同版本的 Python 解释器。
和其他编程语言一样,Python 会区别对待数字、文本、布尔值等数据。Python 的做法是为它们赋予不同的数据类型(data type)。最常用的数据类型有整型、浮点型、布尔值和字符串。本节会通过一些例子对它们进行逐一介绍。要理解什么是数据类型,需要先解释一下什么是对象。
索引和切片让你可以访问一个序列的指定元素。字符串是字符的序列,我们可以通过字符串来学习这种机制。下一节还会介绍其他支持索引和切片的序列,比如列表和元组。
Python 提供了强大的数据结构以便于处理对象集合。本节会介绍列表、字典、元组和集合。虽然每种数据结构有各自的特点,但它们有一个共同特点,即都能存储多个对象。在 VBA 中,你可能用过集合或者数组来保存多个值。VBA 也提供了一种名为字典的数据结构,这和 Python 中的字典是一样的,不过还是只能用在 Windows 中。现在先来学习最常用的数据结构——列表。
本节会介绍 if 语句、for 循环和 while 循环。if 只会在满足特定条件时执行特定的代码,for 循环和 while 循环会反复执行代码块中的代码。在本节末尾,我还会介绍列表推导式,它可以代替 for 循环完成列表的构造。本节首先会介绍代码块的定义,同时还会介绍 Python 最值得注意的特点:有特殊含义的空白。
在本节中我们会了解到如何让代码形成可维护的结构:首先会介绍函数的核心知识,然后会教你如何将代码分成不同的 Python 模块。在本节末尾,我们会运用所学知识研究标准库中的 datetime 模块。
你可能很好奇为什么我有时候在变量名中加下划线,有时候又会把变量名全部大写。在本节中,我会一边介绍 Python 官方的风格指南,一边解释我在格式化方面的选择。Python 使用所谓的 Python 改进提案(Python Enhancement Proposals,PEP)来讨论新语言特性的引入。Python 代码的风格指南就是其中之一。这些提案一般用数字来表示,代码风格指南就被称作 PEP 8。PEP 8 是一系列提供给 Python 社区的风格建议。如果使用相同代码的所有人都遵循相同的代码风格,那么写出的代码可读性就会更高。在开源的世界中,会有很多互不相识的程序员开发同一个项目,此时遵循相同的代码风格会显得尤为重要。
例 3-2 中这个简短的 Python 文件展示了最重要的编程惯例。
例 3-2 pep8_sample.py
"""这个脚本展示了一些 PEP 8 的规则
"""
import datetime as dt
TEMPERATURE_SCALES = ("fahrenheit", "kelvin", "celsius")
class TemperatureConverter:
pass # 暂时不做任何事
def convert_to_celsius(degrees, source="fahrenheit"):
"""这个函数将华氏度或开氏度转化为摄氏度
"""
if source.lower() == "fahrenheit":
return (degrees - 32) * (5/9)
elif source.lower() == "kelvin":
return degrees - 273.15
else:
return f"Don't know how to convert from {source}"
celsius = convert_to_celsius(44, source="fahrenheit")
non_celsius_scales = TEMPERATURE_SCALES[:-1]
print("Current time: " + dt.datetime.now().isoformat())
print(f"The temperature in Celsius is: {celsius}")
变量名称使用小写字母。在可以提升可读性的前提下使用下划线。为变量赋值时,在等号前后添加空格。不过在调用函数时,不要在关键字参数前后使用空格。在进行索引和切片时,不要在方括号前后使用空格。这只是对 PEP 8 的一个简单介绍,在你开始认真使用 Python 之后,应该看一下 PEP 8 的原文。PEP 8 明确指出,这些规则只是建议,应当优先考虑你自己的编程风格。毕竟统一性才是最重要的。如果你对其他公开的编程风格指南感兴趣,也可以看一下谷歌的 Python 风格指南,它和 PEP 8 比较接近。实际上大部分 Python 程序员并未严格遵循 PEP 8,最常见的错误是每行超过了 79 个字符。在编写代码时,要保持格式规整可能很难,不过你可以利用工具让它自动检查代码是否遵循了某种编程风格。下一节会教你如何使用 VS Code 进行自动格式化。
正如第 3 章所描述的那样,如果要对嵌套列表进行数组运算,可以使用循环来完成。例如,要为嵌套列表中的每一个元素都加上 1,可以使用下面的嵌套列表推导式:
In [1]: matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
In [2]: [[i + 1 for i in row] for row in matrix]
Out[2]: [[2, 3, 4], [5, 6, 7], [8, 9, 10]]
但是这样的代码可读性很低。更关键的是,在面对更大的数组时,遍历整个数组会非常慢。如果你的用例和数组大小合适的话,那么使用 NumPy 数组进行运算会比 Python 列表快上几百倍。为了达到如此高的性能,NumPy 利用了用 C 和 Fortran(它们都是编译型语言,比 Python 要快得多)编写的代码。NumPy 数组是保存同构数据(homogenous data)的 N 维数组。'同构'意味着数组中的所有数据都必须是相同类型。最常见的情况就是处理一维和二维的浮点数数组。
下面来创建一个一维数组和一个二维数组,本章会一直使用这两个数组。
In [3]: # 首先导入 NumPy
import numpy as np
In [4]: # 使用列表构造一个一维数组
array1 = np.array([10, 100, 1000.])
In [5]: # 使用嵌套列表构造一个二维数组
array2 = np.array([[1., 2., 3.],
[4., 5., 6.]])
数组维度 要注意一维数组和二维数组之间的区别。一维数组只有一个轴,因此不区分行数组和列数组。这和 VBA 中的数组是类似的,但是如果你是从 MATLAB 等语言转过来的,那么可能需要花点儿时间习惯 NumPy 的做法。
即使 array1 除了最后一个元素(浮点数)之外全是整数,但由于 NumPy 对同构的要求,这个数组的数据类型依然是 float64,这个类型足以容纳所有的元素。要想了解一个数组的数据类型,可以访问它的 dtype 属性:
In [6]: array1.dtype
Out[6]: dtype('float64')
dtype 返回的是 float64 而不是第 3 章中介绍过的 float。你可能已经猜到了,NumPy 使用的是它自己的数值数据类型,它们比 Python 的数据类型粒度要细。通常这都不是问题,因为大部分时候 Python 和 NumPy 中的不同数据类型可以自动转换。如果你需要显式地将 NumPy 数据类型转换成 Python 的基本数据类型,只需使用对应的构造器即可:
In [7]: float(array1[0])
Out[7]: 10.0
在 NumPy 的文档中可以看到 NumPy 数据类型的完整列表。我们马上就会看到,有了 NumPy 数组,就可以以简洁的方式执行数组运算了。
真实世界的数据并非天上掉下来的,在使用数据之前,需要对其进行清理,使其更易于理解。在本节开头,先来看看如何从 DataFrame 中选取数据,如何修改数据,以及如何处理缺失和重复的数据。然后再对 DataFrame 进行一些运算,看看如何处理文本数据。在本节末尾,你会明白 pandas 什么时候会返回视图,什么时候又会返回数据的副本。本节中的很多概念和我们在第 4 章的 NumPy 数组中看到的是相关联的。
在 Excel 中组合不同的数据集是一件麻烦事,通常需要用到很多 VLOOKUP 公式。幸运的是,DataFrame 的组合是 pandas 的'撒手锏',数据对齐机制也会让实现相关功能获得极大的便利,进而能够减少错误发生的可能性。组合和合并 DataFrame 的方法有很多,本节会涉及最常用的 concat、join 和 merge。虽然这些函数的功能有重叠的部分,但是每一个函数都可以让一类特定的工作更加轻松。我会先介绍 concat 函数,然后解释 join 函数的不同选项,最后介绍通用性最高的 merge 函数。
让大型数据集更有条理的方法之一是计算整个数据集或者子集上的描述性统计量,比如总和或平均值。本节首先会介绍如何在 pandas 中计算这些统计量,然后会介绍将数据聚合到子集中的两种方式:groupby 方法和 pivot_table 函数。
绘图可以将数据分析的结果可视化,这可能是整个数据分析过程中最重要的一步。我们需要用到两个库来进行绘图,首先来看 pandas 默认的绘图库 Matplotlib,之后再着眼于另一个现代化的绘图库,即 Plotly,我们可以用它在 Jupyter 笔记本中获得更好的交互式体验。
到目前为止,我们用各种方式构造了 DataFrame:嵌套列表,字典和 NumPy 数组。知道这些技巧很有必要,但是很多时候我们的数据已经准备好了,你只需要将它录入 DataFrame。要做到这一点,pandas 为你提供了各种读取函数。但即便要访问一个专用的系统且 pandas 没有提供内置的读取器,你通常也有一个 Python 包来连接这个系统,一旦获得了数据,要把数据录入 DataFrame 也就很容易了。在 Excel 中,数据导入通常是 Power Query 的工作。在分析和修改数据集之后,你可能想把结果推送回数据库或者导出到一个 CSV 文件中,又或者如本书书名所述,把它放到 Excel 工作簿中给你的上级看。要导出 pandas DataFrame,可以使用 DataFrame 提供的导出方法。表 5-7 展示了最常用的导入和导出方法。
通过本文的介绍,我们了解了 Python 与 Excel 结合使用的巨大潜力。从环境搭建到基础语法,再到 pandas 的核心数据处理功能,这一套流程能够帮助用户摆脱繁琐的手工操作。掌握这些技能后,你可以构建更健壮的应用程序,处理更大规模的数据集,并将分析结果无缝地反馈回 Excel 环境中。这不仅提高了工作效率,还减少了人为错误的风险。对于希望提升数据分析能力的 Excel 用户来说,学习 Python 是一条值得投入的路径。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online