pandas 2.0 很容易被看成一次普通的大版本发布。版本号很醒目,功能清单很长,周围又已经有不少速度更快的 DataFrame 引擎。Joris Van den Bossche 和 Patrick Hoefler 在 PyData Berlin 2023 的演讲之所以有用,是因为它把这次发布讲成一件更安静的事:pandas 在修补 DataFrame 本身的使用承诺。[1][2]
这层差别关系到很多开源用户的日常。pandas 常常待在 notebook、数据流水线、教学材料、内部库和交接代码里,有些代码会留很多年。真正难的问题,是 pandas 在熟悉 API 仍然保留的前提下,能否让修改、内存布局、缺失值、字符串和数据交换少一点意外。官方 2.0 发布说明也呈现了这个方向:非纳秒时间戳支持、更一致的 datetime 解析、可选的 Copy-on-Write 行为,以及 Arrow-backed 数据,都是这次兼容负担很重的过渡的一部分。[3]
这场演讲值得看,还因为它绕开了“旧 pandas”和“新数据系统”的二选一。两位讲者展示的是 pandas 怎样吸收 Arrow、NumPy 和多年用户困惑带来的经验,同时让老用户保住原有心智模型。[1][2] 下文把这段视频当作一件工程材料来读:该留意哪里,设计边线正在移向何处,为什么 pandas 2.0 最好的部分关乎可预测性,多过新鲜感。
图片语境:题图是 pandas 创建者 Wes McKinney 于 2015 年在 Web Summit 上发言的照片。它标出了一段距离:pandas 已经从一位有影响力作者的工具,走向 Python 数据栈里由社区长期维护的兼容层。[7]
演讲开头,2.0 被讲成一次清理
第一个设计线索来自发布方式。Van den Bossche 和 Hoefler 没有把 pandas 2.0 包装成和过去决裂的版本。他们把 2023 年 4 月发布的 2.0 放在一组老问题旁边:时间戳分辨率有限、datetime 解析有歧义、复制和视图容易混淆,以及本该用类型化列式表示的数据却存成 Python 对象,成本偏高。[1][2][3] 这让演讲比功能巡礼更有价值。它指出 pandas 的麻烦不在功能太少,而在同一个 API 被数百万用户拿去做探索、生产 ETL、教学和库内部实现之后,歧义慢慢堆了起来。
时间戳和 datetime 的例子很小,却很能说明问题。pandas 历史上继承了偏向纳秒的 datetime 存储限制,一些日期很难干净表示。2.0 发布说明写到更广的时间戳分辨率支持,也写到更严格的解析选项,包括对混合格式的显式处理。[3] 这些变化没有漂亮的外观,但会减少一种常见挫败:用户只是想理解一列数据,却先被迫了解底层怎么存。
这就是这次发布反复回到的主题。pandas 2.0 没有消灭实现复杂度,而是把复杂度推到更明确的用户承诺后面。日期应当按用户能说清的规则解析。切片之后的修改,应当让人清楚它有没有碰到原对象。字符串列也需要从昂贵的 object 数组里逐步走出来。视频之所以成立,是因为它不断回到这些承诺,没有把每个功能讲成孤立的修补。[1][2]
Copy-on-Write 把警告背后的语义问题摆出来
演讲里最有力量的一段,是 Copy-on-Write。旧 pandas 里,SettingWithCopyWarning 难看的外表之下藏着语义麻烦:用户选出一个子集之后,常常无法判断自己拿到的是独立对象,还是一个会把修改带回共享数据的视图。[1][2][4] 警告只是症状,背后是 API 的使用承诺过度依赖内部存储行为。
Copy-on-Write 改变的是这份承诺。当前 pandas 文档把它描述为一种模式:派生对象表现得像副本,pandas 仍可以把真正的复制延后到发生修改、需要分离的时候。[4] 这里的工程折中很清楚。用户看到的规则变简单了:改一个对象,就影响这个对象;不要通过隐藏的视图关系改到另一个 DataFrame。实现层在安全时仍能共享内存。[4]
演讲里的例子把这点讲得很具体。即使 pandas 底层避免了立即复制,一个子集仍可以像自己的对象那样行动。[1][2] 成熟 OSS 项目需要的正是这种边线。用户的日常操作应当少依赖记忆:NumPy 切片何时返回视图、pandas 掩码何时返回副本、链式赋值有没有碰到父对象。用户应当直接写出自己的意图。想改原始 DataFrame,就在原始 DataFrame 上操作;在派生对象上操作,修改就归派生对象。[2][4]
实际结果超过“警告少了”这一层。建在 pandas 之上的库会得到更清楚的迁移路线。防御性的 .copy() 曾经是一种常见仪式,因为开发者要避开远处对象被暗中改动。Copy-on-Write 给维护者一个机会,在保留安全性的同时少写这类防御复制。演讲因此把内存行为和用户语义放在同一个设计问题里处理。[1][2][4]
Arrow-backed 数组把 pandas 带向更宽的数据内存边界
Arrow 这一段,是 pandas 2.0 开始越出 pandas 自身的地方。幻灯片引入 Arrow-backed DataFrame,也就是列可以用 PyArrow 数组存储的 DataFrame,然后把这种存储选择同缺失值、字符串、嵌套类型、I/O 和计算派发连起来。[2][5] pandas 用户指南现在也记录了 PyArrow-backed dtype,包括 ArrowDtype 和 string[pyarrow] 这样的字符串别名。[5]
关键在于它是选择加入。pandas 2.0 没有把所有既有 backend 直接换成 Arrow,而是给出一些入口,让用户通过构造器、转换,以及受支持的 I/O 选项请求 Arrow-backed dtype,例如 dtype_backend="pyarrow"。[2][3][5] 这种保守做法正是它可信的地方。强制重写更容易宣传,却更难让人放心。选择加入的 backend 让 pandas 能试验新的内存约定,同时保护依赖旧 NumPy-backed 行为的代码。
Arrow 自己的列式格式,是为分析数据设计的跨语言内存表示。[6] 放在 pandas 里,DataFrame 可以更直接地进入一个更宽的系统,连接 Python、C++、数据库引擎、文件格式和计算内核。收益包括速度,也包括互操作。以 Python 对象形式存在的字符串列昂贵,也很局部;Arrow-backed 字符串列可以和其他理解 Arrow 内存模型的工具共享一种表示。[5][6]
演讲对这条边线很谨慎。在 2.0 的讲法里,Arrow 支持仍处在实验阶段,幻灯片也明确说到,完整支持尚未覆盖每一个 pandas 操作。[2] 这句提醒反而让功能更可信。成熟开源迁移不是一句“新 backend”口号;它需要分阶段兼容:未支持的操作、上游 Arrow 行为,以及 pandas 自己的 ExtensionArray 接口,都要逐步对齐。[2][5][6]
真正的经验,是 pandas 正在把所有权讲清楚
放在一起看,Copy-on-Write 和 Arrow-backed 数组共享同一条主线。它们都在谈所有权。Copy-on-Write 问的是一次修改归谁。Arrow 问的是内存表示归谁,以及这种表示能否跨过项目边线,减少每次交接都变回 Python 对象的成本。[4][5][6]
这也是为什么这段视频在 pandas 用户之外仍有价值。许多成熟 OSS 项目都会走到类似阶段。早期成功带来很大的使用面。向后兼容让每一次清理都变贵。竞争者和相邻项目又会显出更好的设计选择。维护者随后要判断哪些内部实现可以改,同时保住项目最初有用的那份社会契约。[1][2][3]
按照这场演讲的呈现,pandas 2.0 承认旧 API 的毛刺,并把修补目标放在看不见的内部细节上。Copy-on-Write 给修改更可预测的规则。Arrow-backed 数据给内存布局一条更容易互通的路。发布说明里关于 datetime 解析、时间戳分辨率、I/O 引擎和 dtype 的变化,也在补同一件事。[3][5]
对 2026 年还在判断是否继续深入使用 pandas 的开发者来说,“pandas 变成了 Arrow”或“pandas 变快了”都太粗。更准确的经验是,pandas 正在把 DataFrame 从一个带历史毛刺的便利对象,慢慢转成更清楚的契约面。熟悉的 API 仍在,但项目正在让隐藏部分少一点任意性:数据住在哪里,什么时候复制,怎样修改,又怎样进入数据生态的其他部分。[1][2][4][5][6]
来源
- PyConDE & PyData Berlin, "Pandas 2.0 and beyond" - Joris Van den Bossche and Patrick Hoefler, YouTube video, April 17, 2023.
- Joris Van den Bossche and Patrick Hoefler, "pandas 2.0 and beyond" - conference slides for PyConDE & PyData Berlin 2023.
- pandas documentation, "What's new in 2.0.0" - release notes for the April 3, 2023 major release.
- pandas user guide, "Copy-on-Write" - official explanation of copy/view behavior and mutation semantics.
- pandas user guide, "PyArrow Functionality" - Arrow-backed dtypes, string storage, and I/O integration.
- Apache Arrow documentation, "Columnar Format" - language-independent memory layout used by Arrow implementations.
- Wikimedia Commons, "File:Wes McKinney.jpg" - Web Summit photograph of pandas creator Wes McKinney, 2015.