摘要
一句话总结 Pandas 3.0.0 正式发布,通过引入专用字符串类型、默认启用写时复制(CoW)、新增声明式表达式语法以及提升底层依赖要求,对库的核心逻辑进行了重大重构。
核心要点
- 专用字符串类型:引入专用的
str数据类型替代 NumPy 的object类型,仅接受字符串值并原生支持缺失值。 - 默认写时复制(CoW):索引与子集操作默认返回副本,解决了“视图与副本”的歧义问题,移除了
SettingWithCopyWarning警告,且链式赋值不再有效。 - 声明式表达式语法:新增
pd.col()语法支持(如df.assign(c = pd.col("a") + pd.col("b"))),允许以声明式方式进行列转换,取代 lambda 函数。 - 日期时间精度调整:解析输入时不再默认使用纳秒精度,改为自动推断最合适的精度。
- 零拷贝数据交换:新增对 Arrow PyCapsule 接口的支持,实现与 Arrow 兼容系统的零拷贝数据交换。
- 依赖要求提升:最低运行环境要求升级为 Python 3.11 和 NumPy 1.26.0。
- 时区后端变更:默认时区后端切换为 Python 标准库的
zoneinfo。 - 发布与迁移:新版本已在 PyPI 和 conda 上线,官方同步提供了包含破坏性更改和升级步骤的迁移指南。
风险与不足
- 代码兼容性风险:依赖检查
object数据类型或使用旧方式处理缺失值的代码需要更新以适配新的str标准。 - 时间精度影响:日期时间精度的自动推断机制可能会导致假设使用纳秒级整型值的现有代码出现问题。
- API 与性能差距:社区反馈及核心开发者承认,尽管进行了重大更新,Pandas 在 API 设计和性能方面依然不及替代库 Polars。
正文
Pandas 团队正式发布了 pandas 3.0.0 版本。作为一次重大更新,该版本重构了字符串处理、内存语义以及日期时间精度的核心逻辑,移除了大量已废弃的功能,并对库的 API 核心行为做出了多项关键调整。
以下是本次更新的核心亮点与变更细节:
引入专用的字符串数据类型
在 pandas 3.0 中,字符串数据不再使用 NumPy 原有的 object 数据类型,而是改用专用的 str dtype 进行存储。这一改动旨在为字符串的数据处理提供统一的方法。
- 统一规范:新的
strdtype 仅接受字符串值。 - 简化缺失值管理:原生支持缺失值(missing values)。
- 迁移提示:那些依赖检查
objectdtype 或以旧方式处理缺失值的代码,可能需要进行更新以适配这些新标准。
默认启用写时复制(Copy-on-Write)
新版本正式采用了写时复制(Copy-on-Write)的语义。从用户视角来看,索引与子集操作现在默认会返回副本,这彻底解决了长期存在的“视图(view)与副本(copy)”歧义问题。
- 链式赋值(chained assignment)不再有效。
- 移除了
SettingWithCopyWarning警告。 - 开发者不再需要使用防御性的
.copy()调用来消除警告。 - 注:pandas 内部仍可能为了性能考虑使用视图,但在 API 层面保证了可预测的类似副本的行为。
新增表达式语法与日期时间精度调整
- 声明式表达式语法:引入了对新表达式语法的早期支持。通过使用
pd.col(),开发者能够以声明式方式编写基于列的转换,不再需要 lambda 函数。例如,df.assign(c = pd.col("a") + pd.col("b"))取代了内联可调用函数的需求。该功能预计将在未来版本中得到进一步扩展。 - 日期时间精度:pandas 在解析输入时不再默认使用纳秒精度,而是会自动推断出最合适的精度。这可能会影响那些假设在转换日期时间值时使用纳秒级整型值的代码。
底层架构与依赖项升级
在底层架构方面,pandas 3.0 也进行了重要的现代化升级:
- 零拷贝数据交换:添加了对 Arrow PyCapsule 接口的支持,实现了与 Arrow 兼容系统的零拷贝数据交换。
- 依赖要求提升:最低运行环境要求提升至 Python 3.11 和 NumPy 1.26.0。
- 时区后端:默认时区后端切换为 Python 标准库的
zoneinfo。
社区反响:关于发展方向与 Polars 的竞争
此次更新引发了社区关于 pandas 发展方向、以及与 Polars 等替代库竞争的激烈讨论。
部分用户对 pandas 的现状表达了担忧。有用户评论称,pandas 近期为了成为更灵活的“Python 风格”库而做出了糟糕的设计选择,牺牲了核心的数据科学用户群体,并表示更推荐使用 Polars。另有用户补充认为,这些改动依然无法解决 pandas 糟糕的 API 设计和性能问题,指出业界已经广泛采用 Polars,且“只要开始使用 Polars,可能永远就不会回头了”。
对此,一位 pandas 核心开发者作出了坦诚的回应:
“我并不认为行业真的抛弃了 pandas。相比 Polars,pandas 的使用规模依然十分庞大。但我完全认同,即便有这些改动,pandas 的 API 与性能仍远不及 Polars。”
目前,Pandas 3.0.0 已经在 PyPI 和 conda 上发布,官方同时附带了迁移指南,详细概述了破坏性更改和推荐的升级步骤。