pandas2.0来了,有哪些优点?

之前我们所使用pandas库都是1.0的版本,在今年4月23号pandas更新为2.0,试用到现在,无论在速度上还是平时常用方法都有提升,下面是罗列2.0版本的一些优点。

数据类型pyarrow

pyarrow 是为 Python 社区提供的 Arrow 支持库,与 NumPy 和 Pandas 的集成度非常高,从 2.0 版开始,Pandas 专门加入了对 pyarrow 数据类型的支持。

使用 pyarrow,可以让 pandas 处理数据的数据操作更快,内存使用效率更高,尤其是在处理超大数据集时,其优势更明显。

速度

根据官方的介绍我们都知道,使用Arrow主要就是提高了速度,那么我们来做一个简单的测试:

使用NumPy和PyArrow的读取相同的CSV文件,比较两者的差异。

图片

缺失值

pandas1.0默认引擎+默认数据后端处理Numpy

data = pd.read_csv(self.path + "/" + self.csv_2, encoding="gbk",)

图片

pandas2.0"engine="pyarrow""引擎+数据后端处理pyarrow

data = pd.read_csv(self.path + "/" + self.csv_2, encoding="gbk",engine="pyarrow",dtype_backend="pyarrow")

图片

这个改进可以说是神来之笔,如果用之前默认方法空值和数值类型在一列里,会默认把整型转换成小数值,这绝对是个灾难。如果想还原成整数,还要先筛选再用astype进行转换,Arrow 的引入可以完美地解决问题,更契合的内存数据结构省了很多麻烦。目前 Pandas 2.0 可以手动指定类型为 pyarrow。

举个例子,一份重要的Excel数据表格,我们都会将当前表格复制一份再进行操作,避免不小心改变了原数据结构,而在pandas为了避免上述发生的事情,都会将原数据进行copy。在下面的这段的代码,给subset 设置一个新的值的时候,原始的 df 的值也改变了,这不符合我们的直觉,如果没有意识到这一点, 后面所有关于 df 的计算可能都会有很大的偏差。

df = pd.DataFrame({"foo": [1, 2, 3, 4], "bar": [4, 5, 6, 7]})subset = df["foo"]subset.iloc[0] = 100print(df)

图片

在打开 copy_on_write 之后,subset 改写数据触发了拷贝,数据修改只影响 subset 本身,df 的数据还是不变。

pd.options.mode.copy_on_write = Truedf = pd.DataFrame({"foo": [1, 2, 3, 4], "bar": [4, 5, 6, 7]})subset = df["foo"]subset.iloc[0] = 100print(df)

图片

后面再读取csv格式的文件默认就写成带pyarrow版本的:

data = pd.read_csv(self.path + "/" + self.csv_2, encoding="gbk",engine="pyarrow",dtype_backend="pyarrow")
THE END