進步神速,Pandas 2.1來了!

程式設計學研發表於2023-09-19

本文將介紹Pandas 2.1中的新功能,探討關於這個新版本中最有趣的事情。

前言

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( 110, ( 1_000_000, )),
         "bar": np.random.randint( 1100, ( 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的體驗會更好。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70033967/viewspace-2984548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章