<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一行代碼讓 pandas 的 apply 速度飆到極致!

          共 1350字,需瀏覽 3分鐘

           ·

          2020-10-11 04:33

          來(lái)源:Python數(shù)據(jù)科學(xué)

          作者:東哥起飛

          vaex是pandas的替代工具。它利用了內(nèi)存映射的原理,所以比pandas能快上幾百倍,但是vaex目前功能有限,所以暫時(shí)pandas還是無(wú)法撼動(dòng)的。

          1.?pandas提速的方法回顧

          如果想要讓pandas提速,筆者總結(jié)有兩個(gè)方法:

          1.?向量化

          向量化是最優(yōu)的方法,舉個(gè)例子,我們將向量化定義為使用Numpy表示整個(gè)數(shù)組而不是元素的計(jì)算。下面有兩個(gè)數(shù)組:

          array_1?=?np.array([1,2,3,4,5])
          array_2?=?np.array([6,7,8,9,10])

          我們希望創(chuàng)建一個(gè)新數(shù)組,該數(shù)組是兩個(gè)數(shù)組的總和,結(jié)果應(yīng)該是:

          result?=?[7,9,11,13,15]

          當(dāng)然,我們也可以在Python中使用for循環(huán)將這些數(shù)組求和,但這非常慢。替代的是,Numpy允許我們直接在陣列上進(jìn)行操作,這要快得多,尤其是大型陣列。

          result?=?array_1?+?array_2

          2. 并行化

          其次是并行化。
          相信大家平時(shí)對(duì)pandas使用比較多的一個(gè)功能就是apply功能,使用自帶函數(shù)或者自己寫個(gè)函數(shù),可以直接對(duì)dataframe進(jìn)行變換,非常香!
          但由于pandas的apply只是將函數(shù)應(yīng)用于dataframe的每一行,只調(diào)用當(dāng)個(gè)處理器,如果行數(shù)非常多,那么將非常慢。
          但如果我們利用多處理器并行化,將dataframe數(shù)據(jù)框分成多個(gè)部分,然后將每個(gè)部分都送到處理器,最后再將各個(gè)部分組合拼成回單個(gè)dataframe,這就快多了!
          如何將這兩個(gè)方法結(jié)合起來(lái),對(duì)apply功能提速?

          本次給大家分享一個(gè)神器?Swifter,可以自動(dòng)讓apply的運(yùn)行速度達(dá)到最快,并且只需要一行代碼!

          2. Swifter介紹

          Swifter是這樣做的。
          1. 首先,檢查apply的函數(shù)是否可以向量化,如果可以,就自動(dòng)使用向量化的計(jì)算(最有效果)。
          2. 如果無(wú)法進(jìn)行向量化,那就檢查使用Dask進(jìn)行并行處理或僅使用普通Pandas的apply(僅使用單個(gè)內(nèi)核)哪個(gè)更合理。
          并行化并不是一定要用的,因?yàn)椴⑿刑幚淼拈_銷會(huì)使小型數(shù)據(jù)集的處理速度變慢,所以這個(gè)也需要根據(jù)數(shù)據(jù)集的大小情況具體分析。
          來(lái)看一張圖。
          通過上圖結(jié)果可以總結(jié)出:無(wú)論數(shù)據(jù)大小如何,使用向量化的結(jié)果幾乎總是更好的,但如果無(wú)法做到向量化,那我們就退而求其次,通過并行讓pandas速度最優(yōu)(當(dāng)數(shù)據(jù)集大小超過某個(gè)閾值的時(shí)候,紅線和藍(lán)線的交點(diǎn))。
          太牛掰了,使用swifter可以直接為我們自動(dòng)選擇最佳的方式。
          3. 如何使用Swifter?
          Swifter的使用非常簡(jiǎn)單。
          import?pandas?as?pd
          import?swifter

          df.swifter.apply(lambda?x:?x.sum()?-?x.min())
          我們只需要引入swifter,然后簡(jiǎn)單的一行代碼調(diào)用即可,趕快試一下這個(gè)神器!

          長(zhǎng)按掃碼添加“Python小助手”



          ▼點(diǎn)擊成為社區(qū)會(huì)員? ?喜歡就點(diǎn)個(gè)在看吧

          瀏覽 60
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品人伦一区二区 | 亚洲色图21p | 亚洲性爱电影 | 91无码人妻精品1国产四虎 | 欧美成人精品免费 |