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

          最近,又發(fā)現(xiàn)了Pandas中三個(gè)好用的函數(shù)

          共 3026字,需瀏覽 7分鐘

           ·

          2022-02-22 14:27


          導(dǎo)讀

          筆者早先學(xué)習(xí)Python以及數(shù)據(jù)分析相關(guān)知識時(shí),對Pandas投入了很多精力,自認(rèn)掌握的還算扎實(shí),期間也總結(jié)分享了很多Pandas相關(guān)技巧和心得(點(diǎn)擊上方“Pandas”標(biāo)簽可以查看系列文章)。近日,在github中查看一些他人提交的代碼時(shí),發(fā)現(xiàn)了Pandas中這三個(gè)函數(shù),在特定場景中著實(shí)好用,遂成此文以作分享。


          程序的基本結(jié)構(gòu)大體包含三種,即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),其中循環(huán)結(jié)構(gòu)應(yīng)該是最能體現(xiàn)重復(fù)執(zhí)行相同動(dòng)作的代碼控制語句,因此也是最必不可少的一種語法(當(dāng)然,順序和分支也都是必不可少的- -!)。雖然Pandas中提供了很多向量化操作,可以很大程度上避免暴力循環(huán)結(jié)構(gòu)帶來的效率低下,但也不得不承認(rèn)仍有很多情況還是循環(huán)來的簡潔實(shí)在。


          因此,為了在Pandas中更好的使用循環(huán)語句,本文重點(diǎn)介紹以下三個(gè)函數(shù):

          • iteritems

          • iterrows

          • itertuples


          當(dāng)然,這三個(gè)函數(shù)都是面向DataFrame這種數(shù)據(jù)結(jié)構(gòu)的API,所以為了便于后文介紹三個(gè)函數(shù),構(gòu)造以下DataFrame實(shí)例:


          01 iteritems
          首先介紹iteritems。我們知道,Pandas中的DataFrame有很多特性,比如可以將其視作是一種嵌套的字典結(jié)構(gòu):外層字典的key為各個(gè)列名(column),相應(yīng)的value為對應(yīng)各列,而各列實(shí)際上即為內(nèi)層字典,其中內(nèi)層字典的key即為行索引,相應(yīng)的value則為對應(yīng)取值。所以,對于一個(gè)DataFrame,我們可以方便的使用類似字典那樣,根據(jù)一個(gè)列名作為key來獲取對應(yīng)的value值,例如在上述DataFrame中:


          當(dāng)然,這是Pandas中再基礎(chǔ)不過的知識了,這里加以提及是為了引出DataFrame的下述API:即,類似于Python中字典的items()方法可以返回所有鍵值對那樣,DataFrame也提供了items方法,返回結(jié)果相信也正是猜測的那樣:


          當(dāng)然,返回的結(jié)果是一個(gè)生成器(生成器是Python3中的一個(gè)重大優(yōu)化,尤其適用于在數(shù)據(jù)量較大時(shí)提供memory-efficient的遍歷)。我們可以將其強(qiáng)制轉(zhuǎn)化為一個(gè)列表,并進(jìn)而得到如下結(jié)果:


          那么,DataFrame的items方法與這里要講的iteritems方法有什么關(guān)系呢?在我初次看到這兩個(gè)API時(shí),直覺想法就是items顯式的以列表形式返回各個(gè)item信息,而iteritems則以迭代器的形式返回各個(gè)item信息。但后來發(fā)現(xiàn),實(shí)際上items()的返回值也是一個(gè)迭代器。進(jìn)一步的,查看函數(shù)簽名文檔,發(fā)現(xiàn)二者其實(shí)就是一致的,甚至連iteritems文檔中的example都用的items。

          iteritems的更多文檔部分可自行查看

          筆者猜測,可能是在早期items確實(shí)以列表形式返回,而后來優(yōu)化升級為以迭代器形式返回了。不過在pandas文檔中簡單查閱,并未找到相關(guān)描述。


          那么,說了這么多,iteritems到底有什么用呢?我個(gè)人總結(jié)為如下幾個(gè)方面:

          • 方便的以(columnName, Series)元組對的形式逐一遍歷各行進(jìn)行相應(yīng)操作

          • 以迭代器的形式返回,在DataFrame數(shù)據(jù)量較大時(shí)內(nèi)存占用更為高效

          • 另外,items是iteritems的同名函數(shù),二者在功能上目前已無差別


          02 iterrows

          在前面介紹了iteritems的基礎(chǔ)上,這里介紹iterrows就更加簡單了。如果說iteritems是對各列進(jìn)行遍歷并以迭代器返回鍵值對,那么iterrows則是對各行進(jìn)行遍歷,并逐行返回(行索引,行)的信息。


          首先來看函數(shù)的簽名文檔:


          而后,仍以前述DataFrame為例,查看其返回結(jié)果:

          這里仍然顯式轉(zhuǎn)化為list輸出


          結(jié)果不出所料:返回結(jié)果包含5個(gè)元組對,其中各元組的第一個(gè)值為相應(yīng)的行索引,第二個(gè)值為對應(yīng)行的Series格式。不過細(xì)看之下,其中有一個(gè)細(xì)節(jié)不容忽視:即各行對應(yīng)Series的dtype均為object。在Pandas中,object往往是由于該行的數(shù)據(jù)類型存在多種類型而向上兼容為object。那么這里為何出現(xiàn)這樣的結(jié)果呢?實(shí)際上,在iterrows的函數(shù)簽名文檔中給出了相應(yīng)的解釋:


          函數(shù)簽名文檔中的示例,由于兩列的原始數(shù)據(jù)類型分別為int和float,所以經(jīng)過iterrows遍歷后,返回的各行Series中數(shù)據(jù)類型變?yōu)閒loat64型,而在本文的示例DataFrame中,由于三列信息分別為int、float和object,所以最終返回的Series數(shù)據(jù)類型即為更通用的泛型:object。

          示例DataFrame的各列信息


          那么,如果想要保留DataFrame中各列的原始數(shù)據(jù)類型時(shí),該如何處理呢?這就需要下面的itertuples。


          03 itertuples
          在介紹itertuples之前,需要首先科普一下Python中預(yù)置的一種數(shù)據(jù)結(jié)構(gòu),namedtuple:


          實(shí)際上,namedtuple是一個(gè)繼承自tuple的子類,區(qū)別在于namedtuple除了可以使用索引來訪問各元素取值外,還支持以各位置的'name'來訪問元素(類似于C語言中的結(jié)構(gòu)體類型),或者說namedtuple可以很方便的無縫轉(zhuǎn)換為dict。


          以此為基礎(chǔ),為了彌補(bǔ)iterrows中可能無法保留各行Series原始數(shù)據(jù)類型的問題,itertuples以namedtuple的形式返回各行,并也以迭代器的形式返回,以便于高效遍歷。仍然來看函數(shù)簽名文檔:


          而后,再看上述DataFrame調(diào)用itertuples后的返回結(jié)果:


          其中,返回值包含5個(gè)namedtuple,這里每個(gè)namedtuple都被命名為Pandas,這可以通過itertuples中的name參數(shù)加以修改;另外,注意到在每個(gè)namedtuple都包含了4個(gè)元素,除了A、B、C三個(gè)列取值外,還以index的形式返回了行索引信息,這可以通過itertuples中的index參數(shù)設(shè)置保留或舍棄。

          由于行索引作為namedtuple中可選的一部分信息,所以與iteritems和iterrows不同,這里的返回值不再以元組隊(duì)的形式顯示行索引信息。


          04 小結(jié)

          以上就是本文分享的Pandas中三個(gè)好用的函數(shù),其使用方法大體相同,并均以迭代器的形式返回遍歷結(jié)果,這對數(shù)據(jù)量較大時(shí)是尤為友好和內(nèi)存高效的設(shè)計(jì)。對于具體功能而言:

          • iteritems是面向列的迭代設(shè)計(jì),items函數(shù)的功能目前與其相同;

          • iterrows和itertuples都是面向行的迭代設(shè)計(jì),其中iterrows以元組對的形式返回,但返回的各行Series可能無法保留原始數(shù)據(jù)結(jié)構(gòu)類型;而itertuples則以namedtuple形式返回各行信息,行索引不再單獨(dú)顯示而是作為namedtuple中的一項(xiàng),并可通過itertuples參數(shù)加以設(shè)置是否保留。

          相關(guān)閱讀:


          瀏覽 165
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  色色一区二区 | 黄页无码视频 | 婷婷五月成人激情 | 人人妻人人摸 | 高清乱伦av |