<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用的6不6,來試試這道題就能看出來

          共 1747字,需瀏覽 4分鐘

           ·

          2021-01-11 18:05


          導讀

          近日,在實際工作中遇到了這樣一道數(shù)據(jù)處理的實際問題,憑借自己LeetCode200+算法題和Pandas熟練運用一年的功底,很快就完成了。特此小結,以資后鑒!


          題目描述:給定一組用戶的多次行為起止時間表,由于相鄰行為之間可能存在交叉(即后一行為的開始時間可能早于前一行為的結束時間),所以需根據(jù)用戶ID對其相應的起止時間信息進行合并處理。不失一般性,模擬示例數(shù)據(jù)如下:

          在上述示例數(shù)據(jù)中,用戶A和用戶B的多組行為間,均存在一定的起止時間交叉,例如用戶A的兩個行為起止時間分別為[3, 6]和[4, 7](同時,這里的兩組行為開始時間先后順序還是錯的),存在交叉,所以可合并為[3, 7];類似地,用戶B的兩個行為起止時間分別為[4, 7]和[6, 8],也可合并為[4, 8]。


          為完成以上這一小需求,實際上可拆解為兩個小問題:

          • 給定同一用戶的多組行為起始時間,根據(jù)起止時間的大小完成區(qū)間合并問題。實際上,這是LeetCode的一道原題

          圖片源自LeetCode56題截圖


          • 在完成單個用戶區(qū)間合并的基礎上,如何處理多用戶的區(qū)間合并以及最后結果的拼接問題。用Pandas的思維來講,自然就是groupby的過程:split—aggregate(range combine)—union


          首先,第一個小問題難度不大,直接實現(xiàn)一個自定義函數(shù)即可,示例代碼如下,其中函數(shù)功能正常執(zhí)行的前提是starts已按照從小到大的順序完成排序,當然這一細節(jié)在pandas中很容易實現(xiàn)。
           1def?range_combine(starts,?ends):
          2????#?在starts有序的前提下,完成區(qū)間合并
          3????combines?=?[]
          4????for?start,?end?in?zip(starts,?ends):
          5????????if?not?combines?or?start?>?combines[-1][1]:
          6????????????combines.append([start,?end])
          7????????else:
          8????????????combines[-1][1]?=?max(combines[-1][1],?end)
          9????return?combines
          10#?測試樣例
          11starts?=?[1,?3,?4,?8]
          12ends?=?[2,?6,?7,?9]
          13range_combine(starts,?ends)
          14#?輸出?[[1,?2],?[3,?7],?[8,?9]]


          為了實現(xiàn)第二個小功能,則需要一定的技巧實現(xiàn)。可以肯定的是,為了實現(xiàn)按用戶分組進行區(qū)間合并,那么肯定要groupby('uid'),而后對每個grouper執(zhí)行range_combine,得到各用戶及其合并后的所有區(qū)間嵌套列表,進而問題轉化為如何將這個嵌套列表再拆分為多行。這就涉及到Pandas中的一個有用的API——explode,即將一個序列分裂成多行,從如下的explode函數(shù)說明文檔中可以看出,它接收一個或多個列名作為參數(shù)(即要拆分的列),當該列的取值是一個列表型的元素時,可以將其拆分,并將該行中其余元素復制多份,從而實現(xiàn)拆分的過程。


          進而,可以完成各用戶多個行為起止區(qū)間分裂成多行的過程,具體實現(xiàn)如下:


          至此,已經(jīng)完成了大部分功能實現(xiàn),僅差最后一步,即將各用戶的歷次合并后的行為起止時間拆分為兩列,分別表示開始和結束時間,這一過程可直接調用pd.Series實現(xiàn)重命名即可。最后給出這個需求的pandas一句代碼完整實現(xiàn)過程:


          一個現(xiàn)實需求,對應多個數(shù)據(jù)處理小技巧,這真是實踐出真知啊!



          相關閱讀:

          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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 | 精品久久无码 | 爱爱视频日韩 | 51妺嘿嘿午夜福利视频 |