<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計(jì)劃(4)——DataFrame分組條件查找值

          共 2165字,需瀏覽 5分鐘

           ·

          2022-02-13 12:03

          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

          日暮東風(fēng)怨啼鳥,落花猶似墜樓人。

          拯救pandas計(jì)劃(4)——DataFrame分組條件查找值

          • / 數(shù)據(jù)需求

          • / 需求拆解

          • / 需求處理

            • 方法一:

            • 方法二:

          • / 總結(jié)


          大家好,我是【??(這是月亮的背面)】。最近發(fā)現(xiàn)周圍的很多小伙伴們都不太樂意使用pandas,轉(zhuǎn)而投向其他的數(shù)據(jù)操作庫(kù),身為一個(gè)數(shù)據(jù)工作者,基本上是張口pandas,閉口pandas了,故而寫下此系列以讓更多的小伙伴們愛上pandas。

          系列文章說明:

          系列名(系列文章序號(hào))——此次系列文章具體解決的需求

          平臺(tái):

          • windows 10
          • python 3.8
          • pandas >=1.2.4

          / 數(shù)據(jù)需求

          依據(jù)各個(gè)用戶的判斷標(biāo)簽,且按照【甲乙丙丁……】依次排序,取得每個(gè)用戶優(yōu)先級(jí)最高的數(shù)據(jù),其他標(biāo)簽列保留。如下圖所示:

          / 需求拆解

          既然是對(duì)每個(gè)用戶進(jìn)行判斷標(biāo)簽優(yōu)先級(jí)的提取,則可以對(duì)每個(gè)用戶進(jìn)行一個(gè)分組,在組內(nèi)進(jìn)行數(shù)據(jù)查找,下面給出兩種我的實(shí)現(xiàn)方法。

          / 需求處理

          方法一:

          由于只有示例中只有一列其他標(biāo)簽,這里可以簡(jiǎn)單處理,如有不需要處理的列數(shù)較多,可以發(fā)揮想象是否能按照此方法進(jìn)行提取。首先處理其他標(biāo)簽值,這里給它用列表包裹起來。

          df['其他標(biāo)簽']?=?df['其他標(biāo)簽'].map(lambda?x:?[x])

          再按每用戶每判斷標(biāo)簽進(jìn)行聚合,在上一步把其他標(biāo)簽處理成list類型,間接的方便了這里的聚合,使用sum對(duì)列表進(jìn)行累加。

          df?=?df.groupby(['用戶',?'判斷標(biāo)簽'],?as_index=False)['其他標(biāo)簽'].sum()

          之后對(duì)判斷標(biāo)簽進(jìn)行排序,這里說明下,早期pandas包的.sort_values沒有key參數(shù),需要自行升級(jí)包才能使用,在沒有key參數(shù)之前對(duì)列進(jìn)行自定義排序是一件比較麻煩的事,需要生成類別序列在該列上,這里只需要將每種類型用字典的形式,規(guī)范化各類別的順序,通過key參數(shù),調(diào)用map函數(shù)即可簡(jiǎn)單且快速的自定義列排序。

          df.sort_values('判斷標(biāo)簽',?key=lambda?x:?x.map({'甲':?1,?'乙':?2,?'丙':?3,?'丁':?4}),?inplace=True)

          可以注意到,每用戶每判斷類型只有一行,順序升序,這里只取優(yōu)先級(jí)較高的判斷標(biāo)簽,可以使用去重函數(shù),保留第一次出現(xiàn)的行即可

          df.drop_duplicates('用戶',?inplace=True)

          現(xiàn)在離我們的目標(biāo)還差一步之遙,唯一的區(qū)別就是其他標(biāo)簽是list類型,最后使用explode方法,單行生成多行的方式處理成目標(biāo)形式。

          df.explode('其他標(biāo)簽')

          大功告成!

          方法二:

          文章開頭提到過,既然是分組取優(yōu)先級(jí)最高的值,那么不妨直接用groupby分組各用戶,再對(duì)組內(nèi)進(jìn)行優(yōu)先值查找。

          def?get_first_label(data):
          ????"""判斷并獲取每一個(gè)分組內(nèi)標(biāo)簽排序最上的值"""
          ????return?data[data['判斷標(biāo)簽']?==?data.head(1)['判斷標(biāo)簽'].values[0]]

          #?可先對(duì)判斷標(biāo)簽進(jìn)行排序,再groupby分組
          df.sort_values('判斷標(biāo)簽',?key=lambda?x:?x.map({'甲':?1,?'乙':?2,?'丙':?3,?'丁':?4}),?inplace=True)
          df.groupby(['用戶']).apply(get_first_label).reset_index(drop=True)

          結(jié)果:

          / 總結(jié)

          分組查找也是在數(shù)據(jù)處理中比較常見的需求了,這里也僅僅是提供兩種自己的淺顯之見,其方法二,雖然看似代碼行數(shù)少,但在執(zhí)行效率上相比方法一略有遜色,當(dāng)數(shù)據(jù)量增大時(shí),每次groupby.apply調(diào)用函數(shù)會(huì)比較吃力,而方法一雖也有g(shù)roupby,但是調(diào)用的是內(nèi)部函數(shù),且處理比較簡(jiǎn)單,自然會(huì)快一點(diǎn),而作為去重,drop_duplicates當(dāng)然是一把好手,該怎么處理數(shù)據(jù)還是看需求量及心情如何。

          明日的太陽(yáng)依舊升起,明天的我們也是大放光彩。


          于二零二二年元月十四作

          小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。

          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 45
          點(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>
                  欧美高清橾逼网免费观看 | 青草青青成人在线 | 欧美日韩国产在线播放 | 国产骚女| 稀缺小u女呦品呦cB视频 |