1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3026字,需瀏覽 7分鐘

         ·

        2022-02-22 14:27


        導(dǎo)讀

        筆者早先學(xué)習(xí)Python以及數(shù)據(jù)分析相關(guān)知識時,對Pandas投入了很多精力,自認(rèn)掌握的還算扎實(shí),期間也總結(jié)分享了很多Pandas相關(guān)技巧和心得(點(diǎn)擊上方“Pandas”標(biāo)簽可以查看系列文章)。近日,在github中查看一些他人提交的代碼時,發(fā)現(xiàn)了Pandas中這三個函數(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)然,順序和分支也都是必不可少的- -!)。雖然Pandas中提供了很多向量化操作,可以很大程度上避免暴力循環(huán)結(jié)構(gòu)帶來的效率低下,但也不得不承認(rèn)仍有很多情況還是循環(huán)來的簡潔實(shí)在。


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

        • iteritems

        • iterrows

        • itertuples


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


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


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


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


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

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

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


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

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

        • 以迭代器的形式返回,在DataFrame數(shù)據(jù)量較大時內(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個元組對,其中各元組的第一個值為相應(yīng)的行索引,第二個值為對應(yīng)行的Series格式。不過細(xì)看之下,其中有一個細(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ù)類型時,該如何處理呢?這就需要下面的itertuples。


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


        實(shí)際上,namedtuple是一個繼承自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個namedtuple,這里每個namedtuple都被命名為Pandas,這可以通過itertuples中的name參數(shù)加以修改;另外,注意到在每個namedtuple都包含了4個元素,除了A、B、C三個列取值外,還以index的形式返回了行索引信息,這可以通過itertuples中的index參數(shù)設(shè)置保留或舍棄。

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


        04 小結(jié)

        以上就是本文分享的Pandas中三個好用的函數(shù),其使用方法大體相同,并均以迭代器的形式返回遍歷結(jié)果,這對數(shù)據(jù)量較大時是尤為友好和內(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ī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天日天天射综合网 | 草草在线观看视频 | 一级A片黄女人高潮网站 | 99产精品成人啪免费网站 | 久久久久99精品成人网站 | 午夜福利日本 | 日韩高清无码电影 | 午夜剧场A | 污污视频网站在线 | 少妇和公翁系列乱小说之采薇 |