Pandas 2.0 主要優(yōu)勢以及代碼實(shí)現(xiàn)!
四月,官方發(fā)布pandas 2.0.0,在數(shù)據(jù)科學(xué)社區(qū)內(nèi)掀起了軒然大波。
由于其廣泛的功能性和多功能性,如果沒有 import pandas as pd,幾乎不可能做到數(shù)據(jù)操縱,對吧?
雖然我沒意識到所有的大肆宣傳,數(shù)據(jù)中心的人工智能社區(qū)迅速伸出了援手:

截圖來自作者 2.0發(fā)行版看起來在數(shù)據(jù)科學(xué)社區(qū)造成了相當(dāng)大的影響,很多用戶都稱贊新版本里的改進(jìn)。
有趣的事實(shí):你意識到這個(gè)發(fā)行版用了驚人的3年時(shí)間制作的嗎?這就是我所說的“對社區(qū)的承諾”!
所以pandas 2.0帶來了什么?讓我們立刻深入看一下!

表現(xiàn)、速度以記憶優(yōu)勢
正如我們所知,pandas是使用numpy建立的,并非有意設(shè)計(jì)為數(shù)據(jù)幀庫的后端。
因?yàn)檫@個(gè)原因,pandas的主要局限之一就是較大數(shù)據(jù)集的內(nèi)存處理。在這一版本里,大的改變來自于為pandas數(shù)據(jù)引入Apache?Arrow后端。
從本質(zhì)上講,Arrow 是一種標(biāo)準(zhǔn)化的內(nèi)存中列式數(shù)據(jù)格式,具有適用于多種編程語言(C、C++、R、Python 等)的可用庫。對于Python,有PyArrow,它基于Arrow的C++實(shí)現(xiàn),因此速度很快!
所以,長話短說,PyArrow考慮到了我們以往1點(diǎn)幾版本的內(nèi)存限制,允許我們執(zhí)行更快、內(nèi)存更高效的數(shù)據(jù)操作,尤其對大型數(shù)據(jù)集來說。

如您所見,使用新的后端使讀取數(shù)據(jù)的速度提高了近 35 倍。其他值得指出的方面:
如果沒有 pyarrow 后端,每個(gè)列/特征都存儲為自己的唯一數(shù)據(jù)類型:數(shù)字特征存儲為 int64 或 float64,而字符串值存儲為對象;
使用 pyarrow,所有功能都使用 Arrow dtypes:請注意 [pyarrow] 注釋和不同類型的數(shù)據(jù):int64、float64、字符串、時(shí)間戳和雙精度:


Arrow數(shù)據(jù)類型及Numpy索引
除了讀取數(shù)據(jù)(這是最簡單的情況)之外,您還可以期待一系列其他操作的其他改進(jìn),尤其是那些涉及字符串操作的操作,因?yàn)?pyarrow 對字符串?dāng)?shù)據(jù)類型的實(shí)現(xiàn)非常有效:

事實(shí)上,Arrow 比 numpy 具有更多(和更好的支持的)數(shù)據(jù)類型,這些數(shù)據(jù)類型在科學(xué)(數(shù)字)范圍之外是必需的:日期和時(shí)間、持續(xù)時(shí)間、二進(jìn)制、小數(shù)、列表和地圖。瀏覽 pyarrow 支持的數(shù)據(jù)類型和 numpy 數(shù)據(jù)類型之間的等效性實(shí)際上可能是一個(gè)很好的練習(xí),以便您學(xué)習(xí)如何利用它們。
現(xiàn)在也可以在索引中保存更多的?numpy 數(shù)值類型。傳統(tǒng)的?int64、uint64 和 float64 為所有 numpy 數(shù)字 dtypes Index 值打開了空間,因此我們可以指定它們的 32 位版本:

更容易處理缺失值

注意在引入?singleNone 值后,點(diǎn)如何自動從 int64 更改為 float64。
對于數(shù)據(jù)流來說,沒有什么比錯(cuò)誤的排版更糟糕的了,尤其是在以數(shù)據(jù)為中心的?AI 范式中。錯(cuò)誤的排版直接影響數(shù)據(jù)準(zhǔn)備決策,導(dǎo)致不同數(shù)據(jù)塊之間的不兼容性,即使以靜默方式傳遞,它們也可能損害某些輸出無意義結(jié)果的操作。
寫入時(shí)復(fù)制優(yōu)化
Pandas 2.0 還添加了一種新的惰性復(fù)制機(jī)制,該機(jī)制會延遲復(fù)制數(shù)據(jù)幀和系列對象,直到它們被修改。
這意味著在啟用寫入時(shí)復(fù)制時(shí),某些方法將返回視圖而不是副本,這通過最大限度地減少不必要的數(shù)據(jù)重復(fù)來提高內(nèi)存效率。
這也意味著在使用鏈?zhǔn)椒峙鋾r(shí)需要格外小心。如果啟用了寫入時(shí)復(fù)制模式,則鏈?zhǔn)椒峙鋵⒉黄鹱饔?,因?yàn)樗鼈冎赶蛞粋€(gè)臨時(shí)對象,該對象是索引操作的結(jié)果(在寫入時(shí)復(fù)制下的行為類似于副本)。