<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的迭代效率

          共 1548字,需瀏覽 4分鐘

           ·

          2021-06-19 22:00



          pandas這個(gè)包,說老實(shí)話,挺坑人的……主要是你一用它,就會(huì)上癮,然后不管啥情況,只要有可能靠上邊,你就會(huì)把其他方式給忘記了,比如蝦神近期發(fā)現(xiàn),自己都不太會(huì)寫循環(huán)迭代了……這就是被pandas給慣壞的……

          真是:
          擼(熊)貓一時(shí)爽,
          一直擼貓一直爽……

          今天來聊一個(gè)三代語言最常見的,但是四代語言基本上不怎么用的,而且又是最考驗(yàn)程序性能的話題:迭代。
          先說結(jié)論:
          pandas的迭代設(shè)計(jì)很不好(或者說,是Python本身的性能問題),所以如果有可能,最好不要用直接迭代這種方式來處理Pandas的DataFrame。

          那么下面我們來看用pandas迭代的幾種技術(shù):
          先看看我的模擬數(shù)據(jù):
          這里用Faker模擬數(shù)據(jù)工具包,模擬了100萬條中文人員信息數(shù)據(jù),如下:
          (從地址就看得出必然是假的了)
          其中,在name這個(gè)列,我隨機(jī)在前后增加了一個(gè)空格,也就是說,模擬這份數(shù)據(jù)里面,有多了空格的臟數(shù)據(jù)存在,這種臟數(shù)據(jù)對(duì)我們的查詢影響很大,如下所示:
          胡淑華前面有一個(gè)空格,如果不處理,在查詢的時(shí)候,會(huì)導(dǎo)致這種情況:

          所以,我們要把name這個(gè)列的前后空格給去掉,下面我們通過這個(gè)例子,來說明pandas的迭代效率問題。


          第一種方式,是最常見的,由Pandas內(nèi)置的迭代器函數(shù),主要有以下幾種:
          literrows(): 將DataFrame迭代為(insex, Series)對(duì)。
          litertuples(): 將DataFrame迭代為元祖。
          literitems(): 將DataFrame迭代為(列名, Series)對(duì)

          我們以第一種iterrows為例,進(jìn)行處理:
          處理100萬條數(shù)據(jù),花了1分7秒=
          67秒
          然后我們換成第二種,只用索引來進(jìn)行迭代:pandas默認(rèn)會(huì)建立一個(gè)數(shù)值序列的索引,可以通過這個(gè)索引來獲取所有的數(shù)據(jù),代碼如下:
          臥槽……7.96秒,瞬間速度就提升了8.4倍,效果拔群。

          接下去,嘗試第三種,也就是把pandas的列,轉(zhuǎn)換為字典或者列表模式來進(jìn)行迭代:
          包括先轉(zhuǎn)換為字典的時(shí)間,3.9秒
          是最慢的iterrows模式的17倍!

          以上三種方式,都是傳統(tǒng)三代語言的編碼方式:由if和for組成的流程化程序編碼,下面我們來看看四代語言的表現(xiàn):

          首先是向量模式:把pandas的列轉(zhuǎn)為向量,然后用向量函數(shù)來進(jìn)行處理,如直接轉(zhuǎn)換成字符串,然后處理:
          0.253秒,是iterrows的264倍
          當(dāng)然,有同學(xué)說,向量函數(shù)不多,很多時(shí)候我們可能都需要自定義函數(shù)來處理,所以,下面就是Pandas最最強(qiáng)烈推薦的:

          apply模式!


          221毫秒,

          比最慢的iterrows快了

          303倍!

          最后,我們來比較一下五種方式:
          結(jié)論:
          iterrows(或者其他兩個(gè)內(nèi)置迭代),效率是最差的,所以我們只需要做很少的代碼改動(dòng),就可以直接轉(zhuǎn)換為索引迭代模式或者字典迭代模式,效率就可以幾十倍的提升。

          向量模式效率和代碼簡(jiǎn)潔度都很高,但是受到API的限制,很多細(xì)粒度的方法無法實(shí)現(xiàn)。

          而效率最高的apply模式,則需要有一定的編程能力和思維,不過如果你要追求效率極限的話,不妨多學(xué)習(xí)一下這種編程模式。

          最后,這里推薦三代語言出身的老程序員多試用一下索引迭代或者字典迭代模式,因?yàn)槿绻阌X得改編碼模式很麻煩的話,僅換一句話就能提升幾十倍,何樂不為呢?

          加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】

          400+小伙伴一起學(xué)習(xí)!








          · 推薦閱讀 ·

          五種Pandas圖表美化樣式匯總

          聊聊Pandas的前世今生

          超簡(jiǎn)單,讓別人也能訪問到你的Dash應(yīng)用


          瀏覽 80
          點(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>
                  日韩高清无码一区 | 激情瑟瑟 | 蜜芽亚洲无码 | 大香蕉网在线视频 | 色情小电影免费网站观看网址在线播 |