<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函數(shù)加速百倍的技巧

          共 2828字,需瀏覽 6分鐘

           ·

          2021-09-12 16:04

          點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

          重磅干貨,第一時(shí)間送達(dá)

          作者 | 杰少
          來(lái)源 | 
          kaggle競(jìng)賽寶典
          編輯 | 極市平臺(tái)

          導(dǎo)讀

           

          現(xiàn)在的dask,cudf包的出現(xiàn),我們的數(shù)據(jù)處理得到了大大的加速,但不是很貴的人比較好gpu,非常多的朋友仍然可以使用pandas工具包,但等真的很無(wú)奈,熊貓的許多問(wèn)題我們都需要使用apply函數(shù)來(lái)進(jìn)行處理,而apply函數(shù)是非常緩慢的,本文我們就介紹如何加速apply函數(shù)600倍的技巧。

          現(xiàn)在的dask,cudf包的出現(xiàn),我們的數(shù)據(jù)處理得到了大大的加速,但不是很貴的人比較好gpu,非常多的朋友仍然可以使用pandas工具包,但等真的很無(wú)奈,熊貓的許多問(wèn)題我們都需要使用apply函數(shù)來(lái)進(jìn)行處理,而apply函數(shù)是非常緩慢的,本文我們就介紹如何加速apply函數(shù)600倍的技巧。

          實(shí)驗(yàn)對(duì)比

          01 應(yīng)用(基線)

          我們以應(yīng)用為案,原來(lái)的應(yīng)用程序處理下面這個(gè)問(wèn)題,需要18.4 秒的時(shí)間。

          import pandas as pd
          import numpy as np
          df = pd.DataFrame(np.random.randint(0, 11, size=(1000000, 5)), columns=('a','b','c','d','e'))
          def func(a,b,c,d,e):
          if e == 10:
          return c*d
          elif (e < 10) and (e>=5):
          return c+d
          elif e < 5:
          return a+b
          %%time
          df['new'] = df.apply(lambda x: func(x['a'], x['b'], x['c'], x['d'], x['e']), axis=1)
          CPU times: user 17.9 s, sys: 301 ms, total: 18.2 s
          Wall time: 18.4 s

          02 迅捷

          因?yàn)樘幚硎遣⑿械?,所以我們可以使用Swift進(jìn)行加速,在使用Swift之后,相同的操作在我的機(jī)器上可以提升到7.67s 。

          %%time
          # !pip install swifter
          import swifter
          df['new'] = df.swifter.apply(lambda x : func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
          HBox(children=(HTML(value='Dask Apply'), FloatProgress(value=0.0, max=16.0), HTML(value='')))

          CPU times: user 329 ms, sys: 240 ms, total: 569 ms
          Wall time: 7.67 s

          03 矢量化

          使用Pandas和Numpy的避免應(yīng)用方法是將函數(shù)直接化。如果我們的操作是可以直接直接化的話,那么我們就很簡(jiǎn)單的使用

          • 用于循環(huán);
          • 列表處理;
          • 應(yīng)用等操作

          在將上面的問(wèn)題轉(zhuǎn)化為下面的處理之后,我們的時(shí)間為:421 ms

          %%time
          df['new'] = df['c'] * df['d'] #default case e = =10
          mask = df['e'] < 10
          df.loc[mask,'new'] = df['c'] + df['d']
          mask = df['e'] < 5
          df.loc[mask,'new'] = df['a'] + df['b']
          CPU times: user 134 ms, sys: 149 ms, total: 283 ms
          Wall time: 421 ms

          04 類(lèi)別轉(zhuǎn)化+類(lèi)別化

          我們先將上面的類(lèi)別轉(zhuǎn)化為int16型,再進(jìn)行相同的操作,發(fā)現(xiàn)時(shí)間為:116 ms

          for col in ('a','b','c','d'):
          df[col] = df[col].astype(np.int16)
          %%time
          df['new'] = df['c'] * df['d'] #default case e = =10
          mask = df['e'] < 10
          df.loc[mask,'new'] = df['c'] + df['d']
          mask = df['e'] < 5
          df.loc[mask,'new'] = df['a'] + df['b']
          CPU times: user 71.3 ms, sys: 42.5 ms, total: 114 ms
          Wall time: 116 ms

          05 轉(zhuǎn)化為值處理

          在能轉(zhuǎn)化為.values的地方典型轉(zhuǎn)化為.values,再進(jìn)行操作。

          • 這里先轉(zhuǎn)化為.values等價(jià)于轉(zhuǎn)化為numpy,這樣我們的操作會(huì)更快捷。

          于是,上面的操作時(shí)間又被延遲為:74.9ms

          %%time
          df['new'] = df['c'].values * df['d'].values #default case e = =10
          mask = df['e'].values < 10
          df.loc[mask,'new'] = df['c'] + df['d']
          mask = df['e'].values < 5
          df.loc[mask,'new'] = df['a'] + df['b']
          CPU times: user 64.5 ms, sys: 12.5 ms, total: 77 ms
          Wall time: 74.9 ms

          實(shí)驗(yàn)總結(jié)

          通過(guò)上面的一些小技巧,我們將簡(jiǎn)單的長(zhǎng)大了,具體地:

          • 應(yīng)用:18.4 秒
          • 應(yīng)用 + Swifter:7.67 秒
          • 熊貓矢量化:421 毫秒
          • Pandas 矢量化 + 數(shù)據(jù)類(lèi)型:116 毫秒
          • Pandas 向量化 + 值 + 數(shù)據(jù)類(lèi)型:74.9ms

          參考文獻(xiàn)

          https://towardsdatascience.com/do-you-use-apply-in-pandas-there-is-a-600x-faster-way-d2497facfa66

          “拍一拍” 能撤回了 !??!

          5款Chrome插件,第1款絕對(duì)良心!

          為開(kāi)發(fā)色情游戲,這家公司赴日尋找AV女優(yōu)拍攝,期望暴力賺錢(qián)結(jié)果...

          拼多多終于釀成慘劇

          華為阿里下班時(shí)間曝光:所有的光鮮,都有加班的味道


          關(guān)


          ,學(xué)西學(xué)學(xué)運(yùn)營(yíng)護(hù)號(hào),樂(lè)質(zhì),結(jié)識(shí),關(guān)[],學(xué)習(xí)進(jìn)


          瀏覽 46
          點(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>
                  91久久婷婷国产 | 依人av| 日韩在线播放视频 | 免费人成在线 | 操逼手机高清免费看 |