进步神速,Pandas 2.1中的新改进和新功能

本文将介绍Pandas 2.1中的新功能,探讨关于这个新版本中最有趣的事情。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

一、前言

Pandas 2.1于2023年8月30日发布。跟随本文一起看看这个版本引入了哪些新内容,以及它如何帮助用户改进Pandas的工作负载。它包含了一系列改进和一组新的弃用功能。

Pandas 2.1在Pandas 2.0中引入的PyArrow集成基础上进行了大量改进。本文主要关注了对新功能的支持,这些新功能有望在Pandas 3.0中成为默认功能。接下来将深入了解这对用户意味着什么,本文将详细介绍最重要的改进。

图片

二、避免在字符串列中使用NumPy对象类型

pandas中的一个主要问题是低效的字符串表示。Pandas团队花了相当长的时间研究了这个问题。第一个基于PyArrow的字符串dtypepandas 1.3中可用。它有潜力将内存使用量减少约70%并提高性能。

Pandas团队决定引入一个新的配置选项,将所有字符串列存储在PyArrow数组中。不再需要担心转换字符串列,它会自动工作。

可以通过以下方式打开此选项:

pd.options.future.infer_string = True

这个行为将在pandas 3.0中成为默认行为,这意味着字符串列将始终由PyArrow支持。必须安装PyArrow才能使用此选项。

PyArrow与NumPy对象dtype有不同的行为,可能会让人难以详细理解。Pandas团队实现了用于此选项的字符串dtype,以与NumPy的语义兼容。它的行为与NumPy对象列完全相同。

三、改进的PyArrow支持

Pandas团队在pandas 2.0中引入了基于PyArrow的DataFrame。Pandas团队过去几个月的主要目标之一是改进pandas内部的集成。他们的目标是尽可能简化从基于NumPy的DataFrame切换的过程。他们着重解决了修复性能瓶颈的问题,因为这些问题曾经导致意料之外的减速。

接下来查看一个示例:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "foo": np.random.randint(1, 10, (1_000_000, )),
        "bar": np.random.randint(1, 100, (1_000_000,)),
    }, dtype="int64[pyarrow]"
)
grouped = df.groupby("foo")

本文的DataFrame有100万行和10个组。现在来比较一下pandas 2.0.3pandas 2.1的性能:

# pandas 2.0.3
10.6 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# pandas 2.1.0
1.91 ms ± 3.16 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

这个特定的例子在新版本上快了5倍。merge是另一个常用的函数,现在速度会更快。Pandas团队希望现在使用基于PyArrow支持的DataFrames的体验会更好。

四、写入时复制(Copy-on-Write)

写入时复制(Copy-on-Write)最初在pandas 1.5.0中引入,并预计将成为pandas 3.0的默认行为。写入时复制已经在pandas 2.0.x上提供了良好的体验。Pandas团队主要专注于修复已知的错误并提高其运行速度。他们建议现在在生产环境中使用此模式。

现在已经可以看到写入时复制可以将实际的工作流程性能提高50%以上。

五、弃用setitem类操作中的静默类型转换

一直以来,如果将不兼容的值设置到pandas的列中,pandas会默默地更改该列的数据类型。接下来查看一个示例:

ser = pd.Series([1, 2, 3])

0    1
1    2
2    3
dtype: int64

本示例有一个包含整数的系列,结果将是整数数据类型。现在将字母"a"设置到第二行中:

ser.iloc[1] = "a"

0    1
1    a
2    3
dtype: object

这会将Series的数据类型更改为objectObject是唯一可以容纳整数和字符串的数据类型。这对许多用户来说是一个很大的问题。Object列会占用大量内存,导致计算无法正常进行、性能下降等许多问题。为了解决这些问题,它还在内部还添加了很多特殊处理。在过去,DataFrame中的静默数据类型更改带来了很大的困扰。现在这种行为已被弃用,并将引发FutureWarning

FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future 
error of pandas. Value 'a' has dtype incompatible with int64, please explicitly cast to a 
compatible dtype first.
  ser.iloc[1] = "a"

类似本文示例的操作将在pandas 3.0中引发错误。DataFrame的数据类型在不同操作之间将保持一致。当想要更改数据类型时,则必须明确指定,这会增加一些代码量,但对于后续开发人员来说更容易理解。

这个变化会影响所有的数据类型,例如将浮点值设置到整数列中也会引发异常。

六、升级到新版本

可以使用以下命令安装新的pandas版本:

pip install -U pandas

或者:

mamba install -c conda-forge pandas=2.1

这将在用户的环境中安装新版本。

七、结论

本文介绍了几个改进,这些改进将帮助用户编写更高效的代码。这其中包括性能改进,更容易选择PyArrow支持的字符串列和写入时复制(Copy-on-Write)的进一步改进。同时还看到一项弃用功能,它将使pandas的行为在下一个主要版本中更易于预测。

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《Pandas数据分析》

《Pandas数据分析》详细阐述了与Pandas数据分析相关的基本解决方案,主要包括数据分析导论、使用PandasDataFrame、使用Pandas进行数据整理、聚合Pandas DataFrame、使用Pandas和Matplotlib可视化数据、使用Seabom和自定义技术绘图、金融分析、基于规则的异常检测、Python机器学习入门、做出更好的预测、机器学习异常检测等内容。此外,该书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

《Pandas数据分析》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

《Pandas数据分析》icon-default.png?t=N7T8https://item.jd.com/14065178.html

图片

精彩回顾

《手把手教你创建数据科学Docker镜像》

《使用Python控制和监测Docker容器》

《OLAP与OLTP:数据处理系统的比较分析》

《性能优化,利用Python ORM优化SQL查询》

《5个高效的数据科学Python库》

《12个必知必会的Docker命令》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值