數(shù)據(jù)處理是數(shù)據(jù)科學(xué)模型開發(fā)流程的重要組成部分之一。數(shù)據(jù)科學(xué)家需要花費(fèi)80%的時(shí)間準(zhǔn)備數(shù)據(jù)集以使其適合建模。有時(shí),對(duì)大型數(shù)據(jù)集執(zhí)行數(shù)據(jù)整理和探索變得繁瑣的工作,只有等待很長(zhǎng)時(shí)間才能完成計(jì)算,或者轉(zhuǎn)移到某些并行處理。 Pandas 是擁有大量API的著名 Python 庫(kù)之一,但是在可伸縮性方面卻失敗了。對(duì)于大型數(shù)據(jù)集,迭代整個(gè)循環(huán)有時(shí)會(huì)花費(fèi)很多時(shí)間,有時(shí)甚至是數(shù)小時(shí),甚至對(duì)于小型數(shù)據(jù)集,使用標(biāo)準(zhǔn)循環(huán)對(duì)數(shù)據(jù)框架進(jìn)行迭代也非常耗時(shí)。 在本文中,我們將討論在大型數(shù)據(jù)集上加快迭代過程的技術(shù)或技巧。 1、Pandas 內(nèi)置函數(shù):iterrows()iterrows() 是內(nèi)置的 Pandas 庫(kù)函數(shù),它返回一系列的每個(gè)實(shí)例或行。它將數(shù)據(jù)幀作為一對(duì)索引和列特征作為Series進(jìn)行迭代。 我使用了一個(gè)具有1000萬(wàn)條記錄和5列的數(shù)據(jù)集。我們?cè)跀?shù)據(jù)集中使用字符串類型的特征'name',必須將其刪除以刪除空格。 temp=[] 該代碼段執(zhí)行了將近「1967秒」?,F(xiàn)在,讓我們找出其他技術(shù)來遍歷數(shù)據(jù)幀并比較其時(shí)間復(fù)雜度。 按索引迭代數(shù)據(jù)框是具有行和列的Pandas對(duì)象。數(shù)據(jù)幀的行和列都已建立索引,并且可以遍歷索引以遍歷行。
遍歷數(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)換為字典?,F(xiàn)在,與iterrows()函數(shù)相比,在字典上進(jìn)行迭代相對(duì)非??臁?/p> df_dict = df.to_dict('records') 對(duì)數(shù)據(jù)集的字典格式進(jìn)行處理后耗時(shí)「25.5秒」,這比iterrows()函數(shù)快77倍。 使用 apply()apply() 是內(nèi)置的Pandas函數(shù),它允許傳遞一個(gè)函數(shù)并將其應(yīng)用于Pandas系列的每個(gè)值。apply()函數(shù)本身并不快,但是它對(duì)Pandas庫(kù)有很大的改進(jìn),因?yàn)樵摵瘮?shù)有助于根據(jù)所需條件隔離數(shù)據(jù)。
apply() 函數(shù)執(zhí)行耗時(shí)「4.60秒」,比iterrows() 函數(shù)快427倍。 結(jié)論在本文中,我們討論了在Pandas數(shù)據(jù)幀上進(jìn)行優(yōu)化的幾種技術(shù),并比較了它們的時(shí)間復(fù)雜度。建議在非常特殊的情況下使用iterrows()函數(shù)。 可以輕松地從使用iterrows()或索引方法轉(zhuǎn)變?yōu)榛谧值涞牡夹g(shù),該技術(shù)將工作流程的速度提高了77倍。Apply函數(shù)的速度提高了約400倍,但用途有限,人們需要對(duì)代碼進(jìn)行大量更改才能轉(zhuǎn)換為這種方法。 |
|