主頁 > 知識(shí)庫 > pandas groupby分組對(duì)象的組內(nèi)排序解決方案

pandas groupby分組對(duì)象的組內(nèi)排序解決方案

熱門標(biāo)簽:千陽自動(dòng)外呼系統(tǒng) 平頂山外呼系統(tǒng)免費(fèi) 西藏智能外呼系統(tǒng)五星服務(wù) 江蘇客服外呼系統(tǒng)廠家 在哪里辦理400電話號(hào)碼 工廠智能電話機(jī)器人 清遠(yuǎn)360地圖標(biāo)注方法 400電話申請(qǐng)服務(wù)商選什么 原裝電話機(jī)器人

問題:

根據(jù)數(shù)據(jù)某列進(jìn)行分組,選擇其中另一列大小top-K的的所在行數(shù)據(jù)

解析:

求解思路很清晰,即先用groupby對(duì)數(shù)據(jù)進(jìn)行分組,然后再根據(jù)分組后的某一列進(jìn)行排序,選擇排序結(jié)果后的top-K結(jié)果

案例:

取一下dataframe中B列各對(duì)象中C值最高所在的行

df = pd.DataFrame({"A": [2, 3, 5, 4], "B": ['a', 'b', 'b', 'a'], "C": [200801, 200902, 200704, 201003]})

Groupby的基本功能介紹

groupby以后返回DataFrameGroupBy對(duì)象,實(shí)際上還沒有進(jìn)行任何計(jì)算,只是一個(gè)暫時(shí)存儲(chǔ)的容器,

[In]df.groupby('B')
[Out]pandas.core.groupby.DataFrameGroupBy object at 0x11800f588>

對(duì)groupby結(jié)果進(jìn)行簡(jiǎn)單的列選取返回的也是DataFrameGroupBy/SeriesGroupBy對(duì)象,無法可視化

[In]df.groupby('B')['A']   # 返回SeriesGroupBy對(duì)象
[Out]pandas.core.groupby.SeriesGroupBy object at 0x117f6b630>

[In]df.groupby('B')['A','C']   # 返回DataFrameGroupBy對(duì)象
[Out]pandas.core.groupby.DataFrameGroupBy object at 0x117fb84e0>

需要對(duì)DataFrameGroupBy進(jìn)行計(jì)數(shù)、統(tǒng)計(jì)、agg聚合計(jì)算、apply映射計(jì)算和transform等操作,才能生成可視化的數(shù)據(jù)(下文僅以count和size函數(shù)為例展示,不涉及其它的操作)

[In] df.groupby('B', as_index=False)['A'].count()  # 組內(nèi)數(shù)據(jù)統(tǒng)計(jì)
[Out] B A
 0 a 2
 1 b 2

[In] df.groupby('B')['A'].size().reset_index(name='Size') # 組內(nèi)數(shù)據(jù)統(tǒng)計(jì),size和count的一個(gè)顯著區(qū)別在于count不考慮Nan,size考慮Nan
[Out] B Size
 0  a 2
 1  b 2

解決方案一:

對(duì)DataFrameGroupBy對(duì)象,用apply函數(shù)進(jìn)行某列的sort_values排序,再選出其中的最大值所在行

# 返回值是一個(gè)帶有multiindex的dataframe數(shù)據(jù),其中l(wèi)evel=0為groupby的by列,而level=1為原index
[In] df.groupby('B').apply(lambda x: x.sort_values('C', ascending=False))
[Out] A B C
B  
a 3 4 a 201003
 0 2 a 200801
b 1 3 b 200902
 2 5 b 200704

# 通過設(shè)置group_keys參數(shù)對(duì)multiindex進(jìn)行優(yōu)化
[In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False))
[Out] A B  C
 3 4 a 201003
 0 2 a 200801
 1 3 b 200902
 2 5 b 200704

# 再次groupby,并調(diào)用內(nèi)置的first()方法,取最大值
[In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False)).groupby('B').first().reset_index()
[Out]  B A  C
 0 a 4 201003
 1 b 3 200902

解決方案二:

先對(duì)B進(jìn)行整體的sort_values,在groupy取值

[In] df.sort_values('C', ascending=False).groupby('B').first().reset_index()
[Out]  B A  C
 0 a 4 201003
 1 b 3 200902

問題拓展:

以上僅解決了Top-1的問題,如果是Top-k呢?

答案:將first()函數(shù)變?yōu)閔ead()函數(shù)

[In] df.sort_values('C', ascending=False).groupby('B').head(2)
[Out] A B C
 3 4 a 201003
 1 3 b 200902
 0 2 a 200801
 2 5 b 200704

總結(jié):

1、方案二,即先排序再groupby取值更方便

2、pandas中API眾多,在實(shí)際使用時(shí)要捋清各步驟返回值的類型以方便記憶和聯(lián)想

補(bǔ)充:pandas分組groupby、agg,排序sort,連接concat、join

連接concat和join

橫向連接

pd.concat([df6,df7],axis=1)
df6.join(df7)

# df6的表格在前面,如需df7的表格在前需要交換位置

注意點(diǎn):

1、concat這個(gè)方法,既可以實(shí)現(xiàn)橫向連接,也可以實(shí)現(xiàn)縱向連接,通過設(shè)置axis的值來控制,axis=1表示的是橫向連接,如果多個(gè)連接的對(duì)象,放在列表中

2、join也可以實(shí)現(xiàn)

縱向連接

pd.concat([df8,df9],ignore_index=True)

注意點(diǎn):

1、進(jìn)行縱向合并的數(shù)據(jù),需要用[]集合起來

2、ignore_index忽略原有的行索引,重新排列

3、drop_duplicates()刪除重復(fù)數(shù)據(jù)

排序

#按照成績(jī)排序
df10.sort_values('score')
#默認(rèn)升序,從小到大

df10.sort_values(['score','group'],ascending=False,na_position='first')
#sort各個(gè)屬性
參數(shù) 描述
by 字符串或者列表,如果是單個(gè)排序字段,使用的是字符串,如果指定多個(gè),需要使用列表
ascending True的時(shí)候,是按照升序,默認(rèn)是升序
na_position 表示的是空值的位置,'last'是默認(rèn)的,'first'開始位置

分組

### groupby
df11.groupby('class')
df11.groupby(['class','grade'])

for cls,data in df11.groupby(['class','grade']):
print(cls)
print(data)

注意點(diǎn):

1、groupby 如果指定的是一個(gè)列,如果是多個(gè)列[]

2、groupby返回的是一個(gè)對(duì)象,所以不能直接訪問,可以使用for

篩選出分組之后的列

如果篩選出一列數(shù)據(jù)[[列名]],返回的是dataframe對(duì)象

如果篩選出多個(gè)列數(shù)據(jù),直接使用[]和[[]]均可

總結(jié)[[列1,列2,。。。。]]

聚合函數(shù) agg配合使用

dff.groupby('class')[['math']].agg(['mean','max','min','median','std'])
函數(shù) 描述
mean 均值
max 最大值
min 最小值
median 中位數(shù)
std 標(biāo)準(zhǔn)差
count 計(jì)數(shù)
skew 偏度
quantile 指定分位數(shù)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Pandas高級(jí)教程之Pandas中的GroupBy操作
  • pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
  • pandas之分組groupby()的使用整理與總結(jié)
  • Pandas之groupby( )用法筆記小結(jié)
  • 利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
  • pandas獲取groupby分組里最大值所在的行方法
  • pandas groupby 分組取每組的前幾行記錄方法
  • Pandas中GroupBy具體用法詳解

標(biāo)簽:股票 安慶 天水 白城 西安 日照 錦州 隨州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pandas groupby分組對(duì)象的組內(nèi)排序解決方案》,本文關(guān)鍵詞  pandas,groupby,分組,對(duì)象,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pandas groupby分組對(duì)象的組內(nèi)排序解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于pandas groupby分組對(duì)象的組內(nèi)排序解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章