一、選用合適的讀取數據方法
在使用Pandas處理數據時,選擇正確的讀取方式是至關重要的。Pandas提供了多種讀取數據的方式,包括read_csv、read_excel等方法。但是對於大數據量的文件,直接使用read_csv和read_excel等方法可能會導致內存不足的問題。這時就需要採用逐行讀取數據的方式進行處理,並使用一些技巧來加速處理速度。
對於csv文件,可以使用csv模塊自帶的reader來進行逐行讀取。實例代碼如下:
import csv with open('filename.csv', 'r') as f: reader = csv.reader(f) for row in reader: # process row
對於excel文件,可以使用openpyxl模塊進行逐行讀取。實例代碼如下:
import openpyxl workbook = openpyxl.load_workbook('filename.xlsx') worksheet = workbook['Sheet1'] for row in worksheet.iter_rows(values_only=True): # process row
二、使用DataFrame的iterrows()方法
對於小型數據集,可以使用Pandas自帶的iterrows()方法來進行逐行讀取。iterrows()是一個生成器,它將每一行數據轉換為一個元組(index, Series),其中index是行號,Series是行數據。實例代碼如下:
import pandas as pd df = pd.read_csv('filename.csv') for index, row in df.iterrows(): # process row
但是,對於大型數據集,iterrows()的速度較慢,因為它將每一行數據轉換為一個Series對象,而Series對象需要為每一行數據分配內存。這樣就會導致內存消耗過大,處理速度變慢。
三、使用DataFrame的itertuples()方法
相比於iterrows()方法,使用itertuples()方法可以提高處理速度,並且內存佔用較小。itertuples()方法返回一個命名元組對象,其中元組的屬性和列名相對應。與iterrows()方法相比,它不需要為每一行數據分配內存。實例代碼如下:
import pandas as pd df = pd.read_csv('filename.csv') for row in df.itertuples(): # process row
四、使用chunksize參數
對於大型數據集,可以使用chunksize參數來指定每次讀取數據的行數。在read_csv()和read_excel()方法中,chunksize指定一次讀取多少行數據。每次讀取的數據是一個DataFrame對象。通過for循環遍歷每次讀取的DataFrame對象,可以逐行處理數據,並且不會消耗過多的內存。實例代碼如下:
import pandas as pd chunksize = 10000 for df in pd.read_csv('filename.csv', chunksize=chunksize): for row in df.itertuples(): # process row
五、緩存列與使用iloc方法
如果DataFrame中包含不需要處理的列,可以使用Pandas的Memory Efficient使用方法來提高處理效率。實現的方法是使用usecols參數對需要處理的列進行篩選,並採用iloc方法只獲取需要的列對應的數據。實例代碼如下:
import pandas as pd chunksize = 10000 usecols = ['col1', 'col2'] for df in pd.read_csv('filename.csv', chunksize=chunksize, usecols=usecols): col1 = df['col1'] col2 = df['col2'] for i in range(len(col1)): # process col1[i] and col2[i]
六、避免使用apply方法
不要使用apply()方法逐行處理數據,它會導致處理時間變長。對於基於NumPy的操作和聚合函數,應該使用Pandas內置的方法,如sum()、mean()、count()等。對於其他自定義函數,使用向量化的方法進行操作可以提高處理速度。實例代碼如下:
import pandas as pd import numpy as np df = pd.read_csv('filename.csv') # Use Pandas' built-in functions for operations on columns col1_sum = df['col1'].sum() # Use Numpy's vectorized functions for custom operations def custom_func(x): return np.sin(x) df['col2'] = custom_func(df['col2'])
七、結合使用上述方法
對於涉及大型數據集的任務,結合使用上述方法可以提高處理速度和減少內存佔用。例如,結合使用chunksize參數和itertuples()方法可以以更快的速度處理大型CSV文件:
import pandas as pd chunksize = 10000 usecols = ['col1', 'col2'] total_sum = 0 for df in pd.read_csv('filename.csv', chunksize=chunksize, usecols=usecols): for row in df.itertuples(): col1 = row.col1 col2 = row.col2 total_sum += col1 * col2
八、總結
選擇適當的數據讀取方法和處理方法、藉助Python的基礎庫來讀取文件、緩存列、避免使用apply和結合使用多種方法,可以讓我們更快地處理大量數據。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/298029.html