8 月 22 日,微软宣布同 Anaconda 合作,为 Excel 带来 Python 整合。整合了 Python 后的 Excel 可以直接在单元格中运行 Python 代码,使用常用的 Python 库(例如 pandas、numpy、matplotlib 等)来进行统计学运算、绘图等,甚至也可以加载一些机器学习库。
由于在云端进行运算,Python in Excel 并不要求用户在计算机上预先安装任何环境,有 Excel 程序和互联网连接即可开始编程。目前,Python in Excel 已经上线 Microsoft 365 Insider 的 Beta Channel(仅限 Windows 版本),作为免费预览给 Insider 们体验。我也借此机会,打开了 Python in Excel 简单试用了一下。
▍****Python in Excel 的优势
Python in Excel 可以解决一些以往单纯使用 Excel 可能无法做到的数据整理、统计报表、图形绘制等问题。利用 Python 和各类常见、功能强大的库,我们可以在 Excel 中使用 Python 直接访问数据并形成可编辑的输出结果。
举个例子而言,利用 pandas 库的 query 功能,我们可以方便地对数据进行高级筛选,并把结果呈现在 Excel 区域中。
在过去 Excel 本身的高级筛选功能需要我们新开一个区域,将筛选规则写进去;但对于 pandas 而言,则是将相关的筛选要求写进代码。例如,我在整理学生档案信息时,获得了一组学号,需要查看这些学号对应的学生信息。如使用 Excel 的高级筛选功能,我一般会把表头复制到另一张工作表,然后把需要的学号输入进去,再使用高级筛选选择范围。但在 Python in Excel 使用 pandas 的 query 功能,只需要敲一行代码即可。
此外,我们也可以快速在 Excel 中创建数据统计报表。例如 pandas 可以对 DataFrame 执行 describe 函数,返回一组数据的平均数、标准差、最大值、最小值,并默认按照 25% 的步长计算分度值——如果用 Excel 函数,则需要好几个函数才能形成表格;而数据及引用范围的更新,用 Python 也只不过是敲几个字母的事情。
▍****从单元格运行 Python 代码
升级到 Beta Channel 的 Microsoft 365 后,在「公式」选项卡的显著位置即可看到「Python(预览版)」区域,其中我们可以直接向单元格插入 Python,进行重置,或者打开「诊断」窗口。点击「插入 Python」或者在活动单元格中输入 =PY(,即可自动开启 Python 代码输入模式。此时,公式编辑栏左侧会出现一个绿色背景的「PY」图标,表示当前单元格是 Python 代码内容。
与以往在 IDE 环境中使用 csv 或其他模块读取电子表格中的数据不同的是,Python in Excel 可以直接在 Excel 工作表内通过 Python 代码对 Excel 表格的区域加以读取和引用,从而在一定程度上减少了我们的工作量。目前,Python in Excel 目前主要有以下几个方面值得关注:
示例代码
Python in Excel 提供了好几种示例数据,包括使用 pandas、matplotlib、seaborn 等 Python 库进行各类统计分析、绘图等操作。例如,其中一种示例让我们可以使用 pandas 对一组数据进行描述性统计。
初始化
Python in Excel 提供一个默认的已经初始化的环境,这个环境中诸如 numpy、pandas 等常用的库都已经通过 import 声明,用户可以在单元格中直接引用,而无需每次在单元格编程的时候再次声明。目前,默认的初始化环境还无法修改。不过,如果你需要使用除了已经导入的库之外的 Python 库而不想每次都声明,Excel 也提供了一个解决方式,那就是在工作簿的头部新建一个工作表并在第一个单元格声明所需要的库即可 —— 工作簿一开头的工作表总是会最先执行计算。
引用 Excel 表格
Python in Excel 主要使用 pandas 库中「Series」和「DataFrame」两种类型的数据对现有的 Excel 表格进行转化,以符合在 Python 中进行数据分析的需要。前者是一维表,后者是二维表。但除此之外,Python in Excel 也支持 Python 所支持的各类数据类型。在 Python in Excel 中引用 Excel 单元格、区域、表格等的方式是使用 xl() 函数。使用方式如下:
#将 A1:I144 范围内的 Excel 区域作为一个 DataFrame,并以 A 行文字作为标题行df = xl("A1:I144", headers=True) #将名为「IrisDataSet5」表格内的全部数据作为一个 Data Frame,并以第一行文字作为标题行df = xl("IrisDataSet5[#全部]", headers=True)
一旦引用完毕,df 作为一个 DataFrame 的变量名,即可在接下来的 Python 数据分析中使用。例如,可以为 DataFrame 重设索引、建立分类汇总、进行描述统计乃至绘图,或者是读取其内部的某个数据;当然也可以通过列表、字典等存储和传送数据。
Python 输出
Python in Excel 的代码默认使用 Enter 键换行。如果代码已经完成,则可以使用 Ctrl+Enter 键提交。提交后,Excel 会将代码送至云端进行运算,并返回指定形式的输出。Excel 中有两种形式的输出:
Python 数据类型。这种形式的输出会在单元格中显示当前代码运行结果所输出的数据类型,如 DataFrame、List、Image 等等。
Excel 值。这种形式的输出将直接显示 Python 代码运行的结果,例如将 DataFrame 中的数据自动填充到 Excel 区域中(例如上图中 G4 单元格中的 DataFrame 自动填充到了 G4:K12 区域),或者将图表显示在 Excel 表格中。区域中的数据可以使用 Excel 的格式化功能来修改相关格式,例如字体大小、粗细或者是货币单位、小数点后保留位数,等等。
Python 诊断
Python in Excel 也提供一定程度上的诊断工具。当单元格中出现计算错误(例如 #PYTHON 错误表示代码运行出错)时,可以通过「诊断」窗格查看当前工作表或者整个工作簿中 Python 代码执行的问题,并提供历史记录功能。另外,如果在 Python 代码中使用了 print() 函数,显示结果也会呈现在这里;如果仅仅使用 print() 函数在 Python in Excel 中作为输出,单元格中的运算结果将会是 NoneType 类型。
▍****实际体验
在 Excel 的公式栏中写代码,感觉总是有点奇怪。至少在现阶段,实际的代码编辑体验是完全不如 VS Code 等成熟的 IDE 的——代码不支持高亮、没有自动缩进,自动补全功能也尚有缺失,默认编辑字体也奇奇怪怪,Python 还是很需要等宽字体来验证缩进的,然而很多时候正在编辑的代码字体和原先完全不一致,搞得人很烦躁。
为了整理一份数据,我在 Python in Excel 里面写了大概三十行代码,过程很难说有多愉悦;不过好在诊断信息还算详细和准确,让我可以及时发现代码中的一些错误,从而顺利完成数据整理的工作。
不确定上面的这些糟糕的体验会不会在之后的版本更新中得到改进。Anaconda 博客甚至指出,Python in Excel 的目的并非是为开发程序所设计,用户需要专注于将其应用于数据的整理分析,并尽量减少在 Python in Excel 中执行过于复杂的代码。
the Python calculations run in the Microsoft Cloud, and your results are returned to the worksheet.
正如微软官方所说的那样,Python in Excel 的运算过程发生在云端,决定了没有网络的情况下是无法运行 Python in Excel 代码的,会出现 #CONNECT 错误——这在一定程度上可能会对数据保密性产生影响,并且更重要的是,在没有网络的情况下无法及时更新计算结果。
不过,可以直接在 Excel 中使用 Python 来访问 Excel 工作簿中的数据,并且对数据进行整理、运算、分析、绘图,并将结果直接呈现在 Excel 工作簿中,或许是 Python in Excel 最有优势的一点。
此外,以往借助 Excel 公式、数据透视表等工具难以解决的数据分析与可视化难题,利用 Python 强大的各种库也往往可以迎刃而解;也可以直接使用 Python 来定义新的函数来组合一系列 Python 操作,从而简化工作流、提高效率。
值得注意的是,Python in Excel 的提供商 Anaconda 已经推出了专题博客页面,提供许多详细的教程与示例可以学习,十分值得参考。