pandas groupby分組對(duì)象的組內(nèi)排序解決方案
問(wèn)題:
根據(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í)際上還沒(méi)有進(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ì)象,無(wú)法可視化
[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 # 通過(guò)設(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
問(wèn)題拓展:
以上僅解決了Top-1的問(wèn)題,如果是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)縱向連接,通過(guò)設(shè)置axis的值來(lái)控制,axis=1表示的是橫向連接,如果多個(gè)連接的對(duì)象,放在列表中
2、join也可以實(shí)現(xiàn)
縱向連接
pd.concat([df8,df9],ignore_index=True)
注意點(diǎn):
1、進(jìn)行縱向合并的數(shù)據(jù),需要用[]集合起來(lái)
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'開(kāi)始位置 |
分組
### 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ì)象,所以不能直接訪問(wèn),可以使用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實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法實(shí)例
- pandas中g(shù)roupby操作實(shí)現(xiàn)
- pandas中df.groupby()方法深入講解
- pandas?groupby?用法實(shí)例詳解
- Pandas數(shù)據(jù)分析之groupby函數(shù)用法實(shí)例詳解
- pandas中pd.groupby()的用法詳解
- 詳解Pandas中GroupBy對(duì)象的使用
- Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)的實(shí)踐
- Pandas中GroupBy具體用法詳解
- Pandas高級(jí)教程之Pandas中的GroupBy操作
- Pandas groupby apply agg 的區(qū)別 運(yùn)行自定義函數(shù)說(shuō)明
- pandas groupby()的使用小結(jié)
相關(guān)文章
python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟
在數(shù)據(jù)科學(xué)項(xiàng)目中,數(shù)據(jù)預(yù)處理是最重要的事情之一,本文詳細(xì)給大家介紹python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟:拆分訓(xùn)練集和測(cè)試集,處理缺失值,處理分類特征和進(jìn)行標(biāo)準(zhǔn)化處理,需要的朋友可以參考下2023-06-06Python實(shí)現(xiàn)E-Mail收集插件實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)E-Mail收集插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2019-02-02Django Xadmin多對(duì)多字段過(guò)濾實(shí)例
這篇文章主要介紹了Django Xadmin多對(duì)多字段過(guò)濾實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python+gensim實(shí)現(xiàn)文本相似度分析詳解
這篇文章主要介紹了Python+gensim實(shí)現(xiàn)文本相似度分析詳解,在開(kāi)發(fā)中我們會(huì)遇到進(jìn)行文本相似度分析的需求,計(jì)算文本相似度,用于鑒別文章是否存在抄襲,需要的朋友可以參考下2023-07-07python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python爬蟲(chóng)學(xué)習(xí)之requests的使用教程
requests庫(kù)是一個(gè)常用的用于?http?請(qǐng)求的模塊,它使用?python?語(yǔ)言編寫(xiě),可以方便的對(duì)網(wǎng)頁(yè)進(jìn)行爬取。本文將通過(guò)示例詳細(xì)講講requests庫(kù)的使用,需要的可以參考一下2022-08-08使用 setuptools 在 Python 中安裝 egg 
Eggs 是 Python 中以前使用的一種分發(fā)格式,它包含特定項(xiàng)目所需的信息,從依賴項(xiàng)到環(huán)境變量,在本文中,我們將討論如何在 Python 中安裝 egg 文件,以及可用于實(shí)現(xiàn)此操作的工具,感興趣的朋友一起看看吧2023-08-08OpenCV特征匹配和單應(yīng)性矩陣查找對(duì)象詳解
這篇文章主要為大家介紹了OpenCV特征匹配和單應(yīng)性矩陣查找對(duì)象詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04pytorch的梯度計(jì)算以及backward方法詳解
今天小編就為大家分享一篇pytorch的梯度計(jì)算以及backward方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01