<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>

          pandas100個(gè)騷操作:逆天!一行代碼讓 apply 速度飆到極致

          共 1734字,需瀏覽 4分鐘

           ·

          2021-03-14 11:18



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

          作者:東哥起飛


          大家好,我是東哥。

          本篇介紹一行代碼讓 pandas 的 apply 速度飆到極致!


          一. pandas提速的方法回顧

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

          1. 向量化

          向量化是最優(yōu)的方法,具體用法參考文章:pandas100個(gè)騷操作:再見 for 循環(huán)!速度提升315倍!

          舉個(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. 并行化

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

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

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

          df.swifter.apply(lambda x: x.sum() - x.min())
          我們只需要引入swifter,然后簡單的一行代碼調(diào)用即可,趕快試一下這個(gè)神器!
          以上就是本次分享,如果喜歡東哥的騷操作,請(qǐng)給我點(diǎn)個(gè)贊和在看
          參考鏈接:
          [1]. https://github.com/jmcarpenter2/swifter
          [2]. https://towardsdatascience.com/one-word-of-code-to-stop-using-pandas-so-slowly-793e0a81343c



          相關(guān)閱讀:



          瀏覽 59
          點(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>
                  人人操超碰在线观看 | 伊人青青操| 黄色大尺度视频 | 9色在线 se欧美 吖v在线 | 日韩一区二区三区无码 |