拯救pandas計(jì)劃(4)——DataFrame分組條件查找值
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
拯救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è)【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
