Pandas 团队发布了pandas 3.0.0版本,这个重大更新的版本重构了字符串处理、内存语义以及日期时间精度的核心逻辑,同时移除了大量已废弃的功能。该版本对库的 API 核心行为做出了多项关键调整。
在 pandas 3.0 中,字符串数据不再使用 NumPy 原有的object数据类型,而是改用专用的str dtype 存储。这一改动的目的是为字符串的数据处理提供统一的方法。新的str dtype 仅接受字符串值,同时支持缺失值(missing values),简化了缺失数据的管理。那些检查object dtype、或以旧方式处理缺失值的代码,可能需要更新以适配这些新标准。
另一项变更是正式采用写时复制(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,并将默认时区后端切换为标准库的zoneinfo。
此次更新引发了社区关于 pandas 发展方向、以及与 Polars 等替代库竞争的讨论。在一条讨论帖中,有用户评论说:
为了成为更灵活的“Python 风格”的库,pandas 近期做出了诸多糟糕的设计选择,代价就是牺牲了核心的数据科学用户群体。我更推荐使用 Polars。
另有用户补充说:
遗憾的是,这些改动仍然无法解决 pandas 糟糕的 API 设计和性能问题。虽然 pandas 在不断演进,但业界已经广泛采用了 Polars,我认为只要开始使用 Polars,可能永远就不会回头了。
一位 pandas 核心开发者回应说:
我并不认为行业真的抛弃了 pandas。相比 Polars,pandas 的使用规模依然十分庞大。但我完全认同,即便有这些改动,pandas 的 API 与性能仍远不及 Polars。
Pandas 3.0.0 已经在 PyPI 和 conda 上发布,并附有迁移指南,概述了破坏性更改和推荐的升级步骤。
原文链接:
Pandas 3.0 Introduces Default String Dtype and Copy-on-Write Semantics





