pandas团队发布了pandas 3.0.0版本。这一重大更新改变了字符串处理、内存机制以及日期时间处理的核心功能,同时移除了大量已被弃用的功能。此次升级还对库的API中的许多核心行为进行了调整。
在pandas 3.0中,字符串数据现在使用专门的str数据类型进行存储,而非之前使用的NumPy的object数据类型。这一改变旨在为字符串数据的处理提供统一的标准。新的str数据类型只接受字符串值,并允许存在缺失值,从而简化了缺失值的管理。那些原本用于检测object数据类型或以旧方式处理缺失值的代码可能需要进行更新,才能符合这些新标准。
另一个变化是正式采用了“写时复制”机制。从用户的角度来看,索引和子集操作现在会返回数据的副本,从而消除了长期以来关于“视图”与“副本”之间区别的模糊性。因此,链式赋值操作不再有效: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等替代工具之间的竞争关系的讨论。在某个论坛帖子中,有用户这样写道:
最近,pandas做出了一些设计上的错误选择,为了追求更加“符合Python编程习惯”的特性,它牺牲了核心数据科学用户群体的需求。我建议大家使用Polars代替pandas。
还有另一位用户补充道:
遗憾的是,这些改进仍然无法改善 pandas 极其糟糕的 API 设计,也无法使其在性能上赶上 Polars。虽然 pandas 不断发展进步,但整个行业已经普遍接受了 Polars,我认为那些开始使用 Polars 的人不会再考虑改用其他工具了。
一位 pandas 的核心开发人员做出了回应:
我不确定整个行业是否真的已经放弃了 pandas,转而使用 Polars。不过我确实认为,即便进行了那些改进,pandas 的 API 设计和性能仍然远远落后于 Polars。
pandas 3.0.0 已在 PyPI 和 conda 上发布,同时还提供了迁移指南,其中详细列出了可能引发问题的变更内容以及推荐的升级步骤。