pandas 2.0 很容易被误读成一次常规的大版本发布。版本号变大了,功能清单很长,周围生态里也已经挤满了速度更快的 DataFrame 引擎。但 Joris Van den Bossche 和 Patrick Hoefler 在 PyData Berlin 2023 的演讲有用之处,在于它把这次发布放进了一个更安静、更结构性的框架:对 DataFrame 契约本身做一次修补。[1][2]
这个区分关系到那些长期把 pandas 放在 notebook、流水线、教学材料、内部库和交接代码里的开源用户。有些代码会存活多年,真正难的问题并非 pandas 能否赢下每一项 benchmark,而是 pandas 能否保住熟悉的 API,同时让变更、内存布局、缺失值、字符串和交换行为减少意外。官方 2.0 发布说明指向了这种更大的形状:非纳秒时间戳支持、一致的 datetime 解析、可选的 Copy-on-Write 行为,以及 Arrow 支撑的数据,都是这场兼容性负担很重的过渡的一部分。[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 月发布的这个版本,放在一组长期存在的毛边旁边:时间戳分辨率限制、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 支撑的数组把 pandas 推向生态内存边界
Arrow 这一段,是 pandas 2.0 开始越出 pandas 自身的地方。幻灯片引入了 Arrow 支撑的 DataFrame,也就是列可以用 PyArrow 数组存储的 DataFrame,然后把这一存储选择同缺失值、字符串、嵌套类型、I/O 和计算派发联系起来。[2][5] pandas 用户指南现在记录了 PyArrow 支撑的 dtype,包括 ArrowDtype 和 string[pyarrow] 这样的字符串别名。[5]
重要细节是选择加入的形态。pandas 2.0 没有把所有既有 backend 都替换成 Arrow。相反,它暴露了一些方式,让用户可以通过构造器、转换,以及受支持位置的 I/O 选项来请求 Arrow 支撑的 dtype,例如 dtype_backend="pyarrow"。[2][3][5] 这种保守做法正是功能的意义所在。强制重写讲起来会更简单,信任成本也会更高。选择加入的 backend 让 pandas 能测试新的内存契约,同时保护依赖旧 NumPy 支撑行为的代码。
Arrow 自身的列式格式,被设计为分析数据的跨语言内存表示。[6] 放在 pandas 语境中,这意味着 DataFrame 可以更直接地参与一个更宽的系统,连接 Python、C++、数据库引擎、文件格式和计算内核。收益不只是速度,还有互操作性。以 Python 对象形式存在的字符串列昂贵且局部。由 Arrow 支撑的字符串列,可以同其他理解 Arrow 内存模型的工具共享一种表示。[5][6]
演讲对边界很谨慎。在 2.0 的框架里,Arrow 支持仍处在实验阶段,幻灯片也明确指出,并非每一个 pandas 操作都已经获得完整支持。[2] 这条提醒正是这一功能可信的地方。成熟开源迁移不是一句“新 backend”的口号。它是分阶段的兼容过程,未支持的操作、上游 Arrow 行为,以及 pandas 自己的 ExtensionArray 接口,都要在这个过程中逐步汇合。[2][5][6]
真正的经验是 pandas 正在把所有权说得更明确
放在一起看,Copy-on-Write 和 Arrow 支撑的数组不是随机新增项。它们讲的都是所有权。Copy-on-Write 询问谁拥有一次变更。Arrow 询问谁拥有内存表示,以及这种表示能否跨过项目边界,而不用在每一次交接时都变成 Python 对象。[4][5][6]
这也是为什么这段视频在 pandas 用户之外仍有价值。许多成熟 OSS 项目最终都会进入同一阶段。早期成功创造出巨大的表面面积。向后兼容让每一次清理都变得昂贵。竞争者和相邻项目揭示出更好的设计选择。维护者随后必须决定,哪些内部结构可以改变,同时保留最初让项目有用的社会契约。[1][2][3]
按照这场演讲的呈现,pandas 2.0 的回答,并不是假装旧 API 完美无缺。它要做的是让 API 少依赖不可见的内部细节。Copy-on-Write 给变更更可预测的规则。Arrow 支撑的数据给内存布局一条更具互操作性的路径。发布说明也通过 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.