這招可以讓Pandas 數(shù)據(jù)幀處理速度提高400倍!
點擊關(guān)注"Python學(xué)習(xí)與數(shù)據(jù)挖掘"
更多超級干貨第一時間推送給你哦!!!
數(shù)據(jù)處理是數(shù)據(jù)科學(xué)模型開發(fā)流程的重要組成部分之一。數(shù)據(jù)科學(xué)家需要花費80%的時間準(zhǔn)備數(shù)據(jù)集以使其適合建模。有時,對大型數(shù)據(jù)集執(zhí)行數(shù)據(jù)整理和探索變得繁瑣的工作,只有等待很長時間才能完成計算,或者轉(zhuǎn)移到某些并行處理。
Pandas 是擁有大量API的著名 Python 庫之一,但是在可伸縮性方面卻失敗了。對于大型數(shù)據(jù)集,迭代整個循環(huán)有時會花費很多時間,有時甚至是數(shù)小時,甚至對于小型數(shù)據(jù)集,使用標(biāo)準(zhǔn)循環(huán)對數(shù)據(jù)框架進(jìn)行迭代也非常耗時。
在本文中,我們將討論在大型數(shù)據(jù)集上加快迭代過程的技術(shù)或技巧。

1、Pandas 內(nèi)置函數(shù):iterrows()
iterrows() 是內(nèi)置的 Pandas 庫函數(shù),它返回一系列的每個實例或行。它將數(shù)據(jù)幀作為一對索引和列特征作為Series進(jìn)行迭代。
我使用了一個具有1000萬條記錄和5列的數(shù)據(jù)集。我們在數(shù)據(jù)集中使用字符串類型的特征"name",必須將其刪除以刪除空格。
temp=[]
for i,row in df.iterrows():
name_new = row['name'].strip()
temp.append(name_new)
該代碼段執(zhí)行了將近「1967秒」。現(xiàn)在,讓我們找出其他技術(shù)來遍歷數(shù)據(jù)幀并比較其時間復(fù)雜度。
按索引迭代
數(shù)據(jù)框是具有行和列的Pandas對象。數(shù)據(jù)幀的行和列都已建立索引,并且可以遍歷索引以遍歷行。
temp=[]
for idx in range(0,df.shape[0],1):
name_new = df['name'].iloc[idx].strip()
temp.append(name_new)
遍歷數(shù)據(jù)幀并執(zhí)行剝離操作花了將近「223秒」(比iterrows函數(shù)快9倍)。
使用 to_dict()
只需將Pandas數(shù)據(jù)框轉(zhuǎn)換為字典,即可遍歷數(shù)據(jù)框并以閃電般的速度執(zhí)行操作。你可以在Pandas中使用.to_dict()函數(shù)將數(shù)據(jù)框轉(zhuǎn)換為字典。現(xiàn)在,與iterrows()函數(shù)相比,在字典上進(jìn)行迭代相對非常快。
df_dict = df.to_dict('records')
temp=[]
for row in df_dict:
name_new = row['name'].strip()
temp.append(name_new)
對數(shù)據(jù)集的字典格式進(jìn)行處理后耗時「25.5秒」,這比iterrows()函數(shù)快77倍。
使用 apply()
apply() 是內(nèi)置的Pandas函數(shù),它允許傳遞一個函數(shù)并將其應(yīng)用于Pandas系列的每個值。apply()函數(shù)本身并不快,但是它對Pandas庫有很大的改進(jìn),因為該函數(shù)有助于根據(jù)所需條件隔離數(shù)據(jù)。
temp = df['name'].apply(lambda x: x.strip())
apply() 函數(shù)執(zhí)行耗時「4.60秒」,比iterrows() 函數(shù)快427倍。
結(jié)論
在本文中,我們討論了在Pandas數(shù)據(jù)幀上進(jìn)行優(yōu)化的幾種技術(shù),并比較了它們的時間復(fù)雜度。建議在非常特殊的情況下使用iterrows()函數(shù)。
可以輕松地從使用iterrows()或索引方法轉(zhuǎn)變?yōu)榛谧值涞牡夹g(shù),該技術(shù)將工作流程的速度提高了77倍。Apply函數(shù)的速度提高了約400倍,但用途有限,人們需要對代碼進(jìn)行大量更改才能轉(zhuǎn)換為這種方法。

相關(guān)閱讀:
