作者:Admond Lee
編譯:ronghuaiyang
導讀
我們用Pandas來處理大量數據,而不是大數據,為什麼呢?一起來看看吧。
pandas是Python程式語言中用於數據整理和分析的最流行和最受歡迎的數據科學工具之一。
在現實世界中,數據的混亂是不可避免。在清理、轉換、操作和分析數據方面,pandas是一個「真正的」遊戲改變者。簡單地說,pandas幫助清理髒亂差。
我的NumPy和Pandas的故事
當我第一次開始學習Python時,我很自然地接觸了NumPy(Numerical Python)。它是使用Python進行科學計算的基本包,提供了Python中對n-array和矩陣進行操作的大量有用特性。
此外,該庫還提供了對NumPy數組類型的數學操作的向量化,極大地優化了計算,提高了執行速度和性能。
NumPy很酷。
但是仍然存在著對更高層次數據分析工具的一些潛在需求。這就是pandas拯救我的地方。
本質上,pandas的功能構建在NumPy之上,兩個庫都屬於SciPy。這意味著pandas在很大程度上依賴於NumPy數組來實現它的對象來進行操作和計算—但是使用起來更加方便。
在實踐中,NumPy和panda仍然可以互換使用。高級的特點和方便的使用決定了我對pandas的偏愛。
為什麼要用pandas來處理大量數據——而不是大數據?
大量數據和大數據之間有著明顯的區別。隨著圍繞大數據的炒作,我們很容易將所有事情都視為大數據,順其自然。
Dan Ariely教授有一個著名的笑話:
大量和大這兩個詞本身就是「相對的」,在我看來,大量就是小於100GB的數據集。
panda對於小數據(通常從100MB到1GB)非常有效,性能很少受到關注。
然而,如果你從事數據科學或大數據領域,那麼在處理大型數據集時,你遲早會遇到一個常見的問題—性能低下和運行時間長,最終導致內存使用不足。
事實上,由於算法和本地內存的限制,pandas在大數據方面有自己的局限性。因此,大數據通常存儲在計算集群中,具有更高的可伸縮性和容錯性。並且經常可以通過大數據生態系統(AWS EC2、Hadoop等)使用Spark和許多其他工具來訪問。
最後,一種在本地機器(具有一定的內存限制)上,用pandas來處理大量數據的方法是減少數據的內存使用。
如何在大量數據上使用Pandas?
所以問題是:如何使用pandas減少數據的內存使用?
下面的解釋基於我的經驗和一個匿名的大數據集(40 - 50gb),它要求我減少內存使用以適應本地內存進行分析(甚至在將數據集讀入dataframe之前)。
1. 按塊大小讀取CSV文件
說實話,當時我遇到一個錯誤,我無法從CSV文件中讀取數據,我感到很困惑,但時我發現我的本地機器的16GB RAM內存對於數據來說太小了。
然後好消息就來了:我意識到pandas.read_csv有一個名為chunksize的參數!
該參數本質上是指在任何時間為適應本地內存而讀入dataframe的行數。由於數據由7000多萬行組成,因此我將chunksize指定為每次100萬行,每次100萬行將大型數據集分解成許多小塊。
# read the large csv file with specified chunksize
df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)
按塊大小讀取CSV文件
上面的操作產生了一個用於疊代的TextFileReader對象。嚴格地說,df_chunk不是一個dataframe,而是一個用於下一步操作的對象。
一旦我準備好了對象,基本的工作流就是對每個塊執行操作,並將它們連接起來,最後形成一個dataframe(如下所示)。通過疊代每個塊,在將每個塊添加到列表之前,我使用一個函數- chunk_preprocessing執行數據過濾/預處理。最後,我將這個列表連接到最終的dataframe中,以適應本地內存。
chunk_list = [] # append each chunk df here
# Each chunk is in df format
for chunk in df_chunk:
# perform data filtering
chunk_filter = chunk_preprocessing(chunk)
# Once the data filtering is done, append the chunk to list
chunk_list.append(chunk_filter)
# concat the list into dataframe
df_concat = pd.concat(chunk_list)
對每個塊執行操作的工作流
2. 過濾掉不重要的列以節約內存
太好了。在這個階段,我已經有了一個dataframe來執行所需的各種分析。
為了節省數據操作和計算的時間,我進一步過濾掉了一些不重要的列,以節省更多的內存。
# Filter out unimportant columns
df = df[['col_1','col_2', 'col_3', 'col_4', 'col_5', 'col_6','col_7', 'col_8', 'col_9', 'col_10']]
過濾掉不重要的列
3. 更改列的類型
將pandas數據列轉換為另一種類型的最簡單方法是使用 astype()。
我可以說,更改pandas中的數據類型對於節省內存非常有幫助,特別是如果你有大量數據用於高強度的分析或計算(例如,將數據輸入你的機器學習模型中進行訓練)。
通過減少存儲數據所需的比特位,我將數據的總體內存使用量減少了50% !
試試吧。我相信你也會發現這很有用!讓我知道進展如何。
# Change the dtypes (int64 -> int32)
df[['col_1','col_2',
'col_3', 'col_4', 'col_5']] = df[['col_1','col_2',
'col_3', 'col_4', 'col_5']].astype('int32')
# Change the dtypes (float64 -> float32)
df[['col_6', 'col_7',
'col_8', 'col_9', 'col_10']] = df[['col_6', 'col_7',
'col_8', 'col_9', 'col_10']].astype('float32')
更改數據類型節省內存
最後的想法
好了。感謝你的閱讀。
我希望通過分享我在使用大數據時使用panda的經驗,可以幫助你通過減少內存使用並最終提高計算效率來探索pandas處理大量數據的另一個有用特性。
通常,pandas具有我們需要進行數據處理和分析的大多數特性。我強烈建議你去看看它們,因為它們下次會對你有用的。
此外,如果你認真學習如何用Python進行數據分析,那麼這本書是為你準備的—Python for Data Analysis。裡面有在Python中使用pandas操作、處理、清理和處理數據集的完整說明,本書提供了一個全面和逐步的指南,有效地指導你在數據分析中使用pandas。
希望可以對你幫助!
英文原文:https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c
請長按或掃描二維碼關注本公眾號