pandas之分組groupby()的使用整理與總結(jié)
前言
在使用pandas的時(shí)候,有些場(chǎng)景需要對(duì)數(shù)據(jù)內(nèi)部進(jìn)行分組處理,如一組全校學(xué)生成績(jī)的數(shù)據(jù),我們想通過(guò)班級(jí)進(jìn)行分組,或者再對(duì)班級(jí)分組后的性別進(jìn)行分組來(lái)進(jìn)行分析,這時(shí)通過(guò)pandas下的groupby()函數(shù)就可以解決。在使用pandas進(jìn)行數(shù)據(jù)分析時(shí),groupby()函數(shù)將會(huì)是一個(gè)數(shù)據(jù)分析輔助的利器。
groupby的作用可以參考 超好用的 pandas 之 groupby 中作者的插圖進(jìn)行直觀的理解:
準(zhǔn)備
讀入的數(shù)據(jù)是一段學(xué)生信息的數(shù)據(jù),下面將以這個(gè)數(shù)據(jù)為例進(jìn)行整理grouby()
函數(shù)的使用:
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('./data.csv') print(df)
Name Gender Age Score 0 Alen Male 18 80 1 Bob Male 19 90 2 Cidy Female 18 93 3 Daniel Male 20 87 4 Ellen Female 17 96 5 Frankie Male 21 100 6 Gate Male 20 88 7 Hebe Female 22 98
基本操作
在進(jìn)行對(duì)groupby
函數(shù)進(jìn)行學(xué)習(xí)之前,首先需要明確的是,通過(guò)對(duì)DataFrame
對(duì)象調(diào)用groupby()
函數(shù)返回的結(jié)果是一個(gè)DataFrameGroupBy
對(duì)象,而不是一個(gè)DataFrame
或者Series
對(duì)象,所以,它們中的一些方法或者函數(shù)是無(wú)法直接調(diào)用的,需要按照GroupBy
對(duì)象中具有的函數(shù)和方法進(jìn)行調(diào)用。
grouped = df.groupby('Gender') print(type(grouped)) print(grouped) <class 'pandas.core.groupby.groupby.DataFrameGroupBy'>
分組時(shí),不僅僅可以指定一個(gè)列名,也可以指定多個(gè)列名:
grouped = df.groupby('Gender') grouped_muti = df.groupby(['Gender', 'Age']) print(grouped.size()) print(grouped_muti.size()) Gender Female 3 Male 5 dtype: int64 Gender Age Female 17 1 18 1 22 1 Male 18 1 19 1 20 2 21 1 dtype: int64
指定多個(gè)列名個(gè)單個(gè)列名后的區(qū)別在于,分組的主鍵或者索引(indice)將一個(gè)是單個(gè)主鍵,另一個(gè)則是一個(gè)元組的形式:
print(grouped.get_group('Female')) print(grouped_muti.get_group(('Female', 17))) Name Gender Age Score 2 Cidy Female 18 93 4 Ellen Female 17 96 7 Hebe Female 22 98 Name Gender Age Score 4 Ellen Female 17 96
通過(guò)調(diào)用get_group()
函數(shù)可以返回一個(gè)按照分組得到的DataFrame
對(duì)象,所以接下來(lái)的使用就可以按照·DataFrame·對(duì)象來(lái)使用。如果想讓這個(gè)DataFrame
對(duì)象的索引重新定義可以通過(guò):
df = grouped.get_group('Female').reset_index() print(df) index Name Gender Age Score 0 2 Cidy Female 18 93 1 4 Ellen Female 17 96 2 7 Hebe Female 22 98
這里可以總結(jié)一下,由于通過(guò)groupby()
函數(shù)分組得到的是一個(gè)DataFrameGroupBy
對(duì)象,而通過(guò)對(duì)這個(gè)對(duì)象調(diào)用get_group()
,返回的則是一個(gè)·DataFrame·對(duì)象,所以可以將DataFrameGroupBy
對(duì)象理解為是多個(gè)DataFrame
組成的。
而沒有調(diào)用get_group()
函數(shù)之前,此時(shí)的數(shù)據(jù)結(jié)構(gòu)任然是DataFrameGroupBy
,此時(shí)進(jìn)行對(duì)DataFrameGroupBy
按照列名進(jìn)行索引,同理就可以得到SeriesGroupBy
對(duì)象,取多個(gè)列名,則得到的任然是DataFrameGroupBy
對(duì)象,這里可以類比DataFrame
和Series
的關(guān)系。
按照上面的思路理解后,再調(diào)用get_group()
函數(shù)后得到的DataFrame
對(duì)象按照列名進(jìn)行索引實(shí)際上就是得到了Series
的對(duì)象,下面的操作就可以按照Series
對(duì)象中的函數(shù)行了。
在沒有進(jìn)行調(diào)用get_group()
,也就是沒有取出特定某一組數(shù)據(jù)之前,此時(shí)的數(shù)據(jù)結(jié)構(gòu)任然是DataFrameGroupBy
,其中也有很多函數(shù)和方法可以調(diào)用,如max()
、count()
、std()
等,返回的結(jié)果是一個(gè)DataFrame
對(duì)象。
print(grouped.count()) print(grouped.max()[['Age', 'Score']]) print(grouped.mean()[['Age', 'Score']]) Name Age Score Gender Female 3 3 3 Male 5 5 5 Age Score Gender Female 22 98 Male 21 100 Age Score Gender Female 19.0 95.666667 Male 19.6 89.000000
如果其中的函數(shù)無(wú)法滿足你的需求,你也可以選擇使用聚合函數(shù)aggregate
,傳遞numpy
或者自定義的函數(shù),前提是返回一個(gè)聚合值。
def getSum(data): total = 0 for d in data: total+=d return total print(grouped.aggregate(np.median)) print(grouped.aggregate({'Age':np.median, 'Score':np.sum})) print(grouped.aggregate({'Age':getSum}))
aggregate
函數(shù)不同于apply
,前者是對(duì)所有的數(shù)值進(jìn)行一個(gè)聚合的操作,而后者則是對(duì)每個(gè)數(shù)值進(jìn)行單獨(dú)的一個(gè)操作:
def addOne(data): return data + 1 df['Age'] = df['Age'].apply(addOne) df['Age'] = df['Age'].apply(int)
可視化操作
對(duì)組內(nèi)的數(shù)據(jù)繪制概率密度分布:
grouped['Age'].plot(kind='kde', legend=True) plt.show()
由于grouped['Age']
是一個(gè)SeriesGroupby
對(duì)象, 顧名思義, 就是每一個(gè)組都有一個(gè)Series
. 所以直接plot相當(dāng)于遍歷了每一個(gè)組內(nèi)的Age數(shù)據(jù)。
REF
groupby官方文檔
超好用的 pandas 之 groupby
到此這篇關(guān)于pandas之分組groupby()的使用整理與總結(jié)的文章就介紹到這了,更多相關(guān)pandas groupby()分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- pandas獲取groupby分組里最大值所在的行方法
- Pandas之groupby( )用法筆記小結(jié)
- pandas groupby 分組取每組的前幾行記錄方法
- 淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法
- pandas groupby分組對(duì)象的組內(nèi)排序解決方案
- 利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
- Pandas中GroupBy具體用法詳解
- Pandas中的 transform()結(jié)合 groupby()用法示例詳解
- pandas中pd.groupby()的用法詳解
相關(guān)文章
python 解決數(shù)據(jù)庫(kù)寫入時(shí)float自動(dòng)變?yōu)檎麛?shù)的問(wèn)題
這篇文章主要介紹了python 解決數(shù)據(jù)庫(kù)寫入時(shí)float自動(dòng)變?yōu)檎麛?shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)
這篇文章主要實(shí)現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊(duì)列、鏈表。大家都知道可以用C語(yǔ)言實(shí)現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實(shí)Python也可以實(shí)現(xiàn),下面跟著小編一起來(lái)學(xué)習(xí)。2016-08-08python判斷計(jì)算機(jī)是否有網(wǎng)絡(luò)連接的實(shí)例
今天小編就為大家分享一篇python判斷計(jì)算機(jī)是否有網(wǎng)絡(luò)連接的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn)
本文主要介紹了Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03