pandas库+3个小技巧=内存占用小、读取时间少?
點擊上方關注,All in AI中國
Pandas已經成為最受歡迎的數據科學庫之一。它易于使用,文檔非常棒,而且功能強大。
然而,無論使用哪一個庫,大型的數據集總是會帶來額外的挑戰,這些是需要謹慎處理的。
你一開始遇到硬件障礙,是因為您沒有足夠的內存來保存所有數據。尤其是遇到企業公司存儲的數據集最多可達到100GB或甚至1000的GB的情況。
即使你確實是購買了足夠內存來存儲所有數據的計算機,將其讀入內存中的速度也會非常慢。
但是Pandas庫將再次幫助我們。本文將討論三種技巧,你可以使用它們來減少大數據集的內存占用和讀取時間。我已經嘗試將這些技術用于超過100GB大小的數據集,并將它們壓縮到只有64 GB甚至32GB RAM的機器上。
下面讓我們來看看吧!
整理你的數據
CSV格式是一種非常方便的數據存儲方式,易于編寫且人們可讀。 另外,有一個很好的pandas函數read_csv()用于加載存儲為CSV的數據。但是當你的CSV太大以至于內存不足時會發生什么?有一個非常簡單的Pandas技巧來處理它! 我們并不是嘗試去一次性處理我們的數據,而是將它們分成幾個部分。 通常,這些部分稱為塊。塊只是我們數據集的一部分。 我們可以根據需要去制作成大塊或小塊,這取決于我們有多少內存。
這個過程是這樣進行的:
- 先讀入一大塊
- 并處理塊
- 保存塊的結果
- 重復步驟1到3,直到得到所有塊結果
- 組合塊的結果
我們可以使用名為chunksize的read_csv()函數的方便變量來執行上述所有步驟。chunksize表示一次讀取多少CSV行。這當然取決于您有多少內存以及每一行有多大。
如果我們認為我們的數據像高斯分布一樣很容易處理,那么我們就可以一對一的,對每個塊執行我們想要的處理和可視化,因此不會損失太多的準確性。
如果我們的分布有點像泊松分布那樣復雜,那么最好在處理之前過濾每個塊并將所有小塊放在一起。大多數情況下,您最終會刪除許多不相關的列或刪除缺少值的行。我們可以對每個塊都這樣做,使它們更小,然后將它們放在一起,并對最終的數據文件執行數據分析。
以下的代碼執行了這些步驟。
刪除數據
有時候,我們會先知道我們想要分析數據集中的哪些列。事實上,通常情況下,有幾個或多個列是我們不關心的。
在讀取數據之前直接跳過列可以節省大量內存。pandas允許我們,而且指定我們想要讀取的列:
丟棄包含沒有用的信息的列,將是節省內存的方法之一。
我們可以做的另一件事是過濾掉任何缺失或NA值的行。這是用dropna()函數最簡單的:
有一些非常有用的變量,我們可以傳遞給dropna():
方法:
這將允許你指定"any"(如果其中任何列是NA,則刪除一行)或"all"(僅當所有列都是NA時,才刪除一行)
thresh:設置一個閾值,表示要刪除一行需要多少個NA值
subset:選擇將考慮用于檢查NA值的列子集
你可以使用這些參數,尤其是thresh和subset來真正具體了解哪些行將被刪除。
Pandas在讀取時沒有像列一樣的方法來做這個,但我們可以像上面那樣在每個塊上做到這一。
為每一列設置特定的數據類型
對于許多初學數據科學家來說,為每列設置特定數據類型數據類型,并沒有在過多考慮范圍之內。 但是一旦開始處理非常大的數據集時,處理數據類型就變得至關重要。
通常的做法是讀取dataframe,然后根據需要轉換列的數據類型。但是對于一個大的數據集,我們真的必須注意內存空間。CSV中可能有一些列,比如浮點數,它們將占用比它們需要的更多的空間。例如,如果我們下載了一個用于預測股票價格的數據集,我們的價格可能被保存為32位浮點數!
但我們真的需要32個浮點數(float)嗎?大多數情況下,股票是以小數點后兩位指定的價格買進的。即使我們想要非常精確,浮點數16也足夠了。
因此,我們不是使用列的原始數據類型讀入數據集,而是指定我們希望pandas在我們的列中使用讀取的數據類型。 這樣,我們永遠不會消耗比實際需要更多的內存。
使用read_csv()函數中的dtype參數很容易做到這一點。我們可以指定一個字典,其中每個鍵是數據集中的一列,每個值是我們希望使用該鍵的數據類型。
舉個pandas的例子:
我們的教程到此結束!希望這三個技巧能幫你節省很多時間和內存!
編譯出品
總結
以上是生活随笔為你收集整理的pandas库+3个小技巧=内存占用小、读取时间少?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt中触发器的使用
- 下一篇: dell n4050怎么开启无线功能?