Python數(shù)據(jù)分析與應(yīng)用-從數(shù)據(jù)獲取到可視化(第2版)課件 第5章 數(shù)據(jù)聚合與分組運(yùn)算_第1頁(yè)
Python數(shù)據(jù)分析與應(yīng)用-從數(shù)據(jù)獲取到可視化(第2版)課件 第5章 數(shù)據(jù)聚合與分組運(yùn)算_第2頁(yè)
Python數(shù)據(jù)分析與應(yīng)用-從數(shù)據(jù)獲取到可視化(第2版)課件 第5章 數(shù)據(jù)聚合與分組運(yùn)算_第3頁(yè)
Python數(shù)據(jù)分析與應(yīng)用-從數(shù)據(jù)獲取到可視化(第2版)課件 第5章 數(shù)據(jù)聚合與分組運(yùn)算_第4頁(yè)
Python數(shù)據(jù)分析與應(yīng)用-從數(shù)據(jù)獲取到可視化(第2版)課件 第5章 數(shù)據(jù)聚合與分組運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章數(shù)據(jù)聚合與分組運(yùn)算《Python數(shù)據(jù)分析與應(yīng)用:從數(shù)據(jù)獲取到可視化(第2版)》學(xué)習(xí)目標(biāo)/Target

了解分組與聚合的原理,能夠說(shuō)出分組與聚合的原理

掌握分組方法的使用,能夠通過(guò)groupby()方法按不同標(biāo)準(zhǔn)對(duì)數(shù)據(jù)進(jìn)行分組

掌握分組信息的查看方式,能夠通過(guò)多種方式查看分組的信息

熟悉內(nèi)置統(tǒng)計(jì)方法的使用,能夠通過(guò)統(tǒng)計(jì)方法聚合數(shù)據(jù)學(xué)習(xí)目標(biāo)/Target

掌握agg()方法的使用,能夠通過(guò)agg()方法聚合數(shù)據(jù)

掌握transform()方法的使用,能夠通過(guò)transform()方法轉(zhuǎn)換數(shù)據(jù)

掌握apply()方法的使用,能夠通過(guò)apply()方法聚合數(shù)據(jù)章節(jié)概述/Summary在進(jìn)行數(shù)據(jù)分析工作時(shí),我們可能會(huì)遇到這樣的場(chǎng)景:現(xiàn)在要求從日志數(shù)據(jù)中找出每天訪問(wèn)次數(shù)最多的IP,這時(shí)需要先把所有的日志數(shù)據(jù)按天拆分成每天的日志數(shù)據(jù),再對(duì)每天的日志數(shù)據(jù)進(jìn)行統(tǒng)計(jì)運(yùn)算,最后把所有的統(tǒng)計(jì)結(jié)果放到一起,這樣便完成了最初設(shè)定的要求,這個(gè)過(guò)程中用到的思想就是分組與聚合——數(shù)據(jù)重組后再合并。pandas中提供了一些用于分組與聚合的方法,另外還提供一些其他的分組級(jí)運(yùn)算,本章將針對(duì)這些內(nèi)容進(jìn)行詳細(xì)地講解。目錄/Contents01分組與聚合的原理02分組操作03數(shù)據(jù)聚合04分組級(jí)運(yùn)算05案例:籃球運(yùn)動(dòng)員信息分析分組與聚合的原理5.15.1

分組與聚合的原理了解分組與聚合的原理,能夠說(shuō)出分組與聚合的原理學(xué)習(xí)目標(biāo)5.1

分組與聚合的原理分組與聚合是數(shù)據(jù)分析工作中比較常見(jiàn)的操作,它主要根據(jù)一定的拆分標(biāo)準(zhǔn)將原數(shù)據(jù)拆分成若干個(gè)分組,然后對(duì)每個(gè)分組應(yīng)用統(tǒng)計(jì)運(yùn)算,并把運(yùn)算后的結(jié)果合并到一起,便于用戶對(duì)不同分組的數(shù)據(jù)進(jìn)行深入解讀。5.1

分組與聚合的原理分組與聚合的流程應(yīng)用(apply)原數(shù)據(jù)按照一定的拆分標(biāo)準(zhǔn)被拆分為若干個(gè)分組。合并(combine)每個(gè)分組應(yīng)用某個(gè)函數(shù)或方法進(jìn)行相應(yīng)的操作,并產(chǎn)生一個(gè)標(biāo)量值。分組名稱(chēng)與標(biāo)量值整合成新的對(duì)象。拆分(split)5.1

分組與聚合的原理分組與聚合的流程分組操作5.25.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組掌握groupby()方法的使用,能夠通過(guò)groupby()方法按照不同的拆分標(biāo)準(zhǔn)對(duì)數(shù)據(jù)進(jìn)行分組學(xué)習(xí)目標(biāo)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組語(yǔ)法格式pandas的Series類(lèi)或DataFrame類(lèi)中提供了一個(gè)用于實(shí)現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標(biāo)準(zhǔn)將數(shù)據(jù)拆分成若干個(gè)分組。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)by:用于確定分組的拆分標(biāo)準(zhǔn)。axis:表示沿著行或列拆分,取值可以為0(默認(rèn))或‘index’和1或‘columns’,其中0或‘index’代表沿著行拆分,1或‘columns’代表沿著列拆分。5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組語(yǔ)法格式pandas的Series類(lèi)或DataFrame類(lèi)中提供了一個(gè)用于實(shí)現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標(biāo)準(zhǔn)將數(shù)據(jù)拆分成若干個(gè)分組。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)as_index:表示是否返回以分組標(biāo)簽作為索引的對(duì)象輸出,默認(rèn)值為T(mén)rue。sort:表示是否對(duì)分組標(biāo)簽進(jìn)行排序,默認(rèn)值為T(mén)rue。5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組語(yǔ)法格式pandas的Series類(lèi)或DataFrame類(lèi)中提供了一個(gè)用于實(shí)現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標(biāo)準(zhǔn)將數(shù)據(jù)拆分成若干個(gè)分組。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)若groupby()方法的調(diào)用方是Series類(lèi)的對(duì)象,則該方法的返回值是SeriesGroupBy對(duì)象;若groupby()方法的調(diào)用方是DataFrame類(lèi)的對(duì)象,則該方法的返回值是DataFrameBy對(duì)象。5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組參數(shù)by參數(shù)by決定了按照什么樣的標(biāo)準(zhǔn)對(duì)數(shù)據(jù)進(jìn)行分組,該參數(shù)支持多種形式的值,包括列標(biāo)簽、列表、數(shù)組、Series類(lèi)的對(duì)象、字典或函數(shù),其中列表或數(shù)組的長(zhǎng)度必須與待拆分軸上的數(shù)據(jù)個(gè)數(shù)相等。列標(biāo)簽列表數(shù)組Series類(lèi)對(duì)象字典函數(shù)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照列標(biāo)簽進(jìn)行分組當(dāng)使用groupby()方法對(duì)數(shù)據(jù)進(jìn)行分組時(shí),若給參數(shù)by傳入的值是列標(biāo)簽,此時(shí)會(huì)將該列中值相同的行拆分出來(lái)整合成一個(gè)分組,值不同的行拆分出來(lái)自成為一個(gè)分組。importpandasaspddf_obj=pd.DataFrame({'key':['C','B','C','A','B','B','A','C','A'],'num':[2,4,6,8,10,1,14,16,18]})df_gb=df_obj.groupby(by='key')df_gb<pandas.core.groupby.generic.DataFrameGroupByobjectat0x00000277D703DB80>5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照列標(biāo)簽進(jìn)行分組DataFrameGroupBy對(duì)象其實(shí)是一個(gè)可迭代的對(duì)象,可以直接使用for語(yǔ)句進(jìn)行遍歷。forgbindf_gb:print(gb)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照Series類(lèi)的對(duì)象進(jìn)行分組當(dāng)使用groupby()方法對(duì)數(shù)據(jù)進(jìn)行分組時(shí),若給參數(shù)by傳入的值是Series類(lèi)的對(duì)象,此時(shí)會(huì)根據(jù)Series類(lèi)的對(duì)象中的值決定如何分組,若值相同,則需要將原數(shù)據(jù)中與值位置對(duì)應(yīng)的行拆分成一個(gè)分組;若值不同,則需要將原數(shù)據(jù)中與值位置對(duì)應(yīng)的行自成一個(gè)分組。importpandasaspddf_obj=pd.DataFrame({'key':['A','A','B','B','C'],'num':[2,3,4,6,8]})ser_obj=pd.Series(['a','b','c','a','b'])group_obj=df_obj.groupby(by=ser_obj)foriingroup_obj:print(i)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照Series類(lèi)的對(duì)象進(jìn)行分組如果Series類(lèi)對(duì)象的索引長(zhǎng)度小于原對(duì)象的行索引長(zhǎng)度,那么在使用groupby()方法進(jìn)行分組時(shí)會(huì)怎么樣呢?5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照Series類(lèi)的對(duì)象進(jìn)行分組如果Series類(lèi)對(duì)象的索引長(zhǎng)度小于原對(duì)象的行索引長(zhǎng)度,那么在使用groupby()方法進(jìn)行分組時(shí),只會(huì)將原對(duì)象的部分?jǐn)?shù)據(jù)進(jìn)行分組,而不會(huì)將全部的數(shù)據(jù)進(jìn)行分組。ser_diff=pd.Series(['a','b','a'])

group_obj=df_obj.groupby(by=ser_diff)foriingroup_obj:print(i)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照字典進(jìn)行分組當(dāng)使用groupby()方法對(duì)數(shù)據(jù)進(jìn)行分組時(shí),若給參數(shù)by傳入的值是字典,此時(shí)會(huì)將字典的鍵作為原對(duì)象行或列的標(biāo)簽索引,字典的值作為分組的名稱(chēng),根據(jù)分組名稱(chēng)與標(biāo)簽索引的對(duì)應(yīng)關(guān)系進(jìn)行分組。frompandasimportDataFramenum_df=DataFrame({'a':[1,2,3,4],

'b':[5,6,7,8],'c':[9,10,11,12],

'd':[13,14,15,16],

'e':[17,18,19,20]})group_rule={'a':'Group_One','b':'Group_Two','c':'Group_One',

'd':'Group_Thr','e':'Group_Two'}group_obj=num_df.groupby(group_rule,axis=1)foriingroup_obj:print(i)5.2.1

通過(guò)groupby()對(duì)數(shù)據(jù)進(jìn)行分組按照函數(shù)進(jìn)行分組當(dāng)使用groupby()方法對(duì)數(shù)據(jù)進(jìn)行分組時(shí),若給參數(shù)by傳入的值是函數(shù),則會(huì)讓被拆分軸上的標(biāo)簽索引調(diào)用一次該函數(shù),并根據(jù)返回的值決定如何分組,如果值相同,則會(huì)將對(duì)應(yīng)的行或列整合成一組;如果值不同,則會(huì)將對(duì)應(yīng)的行或列自成一組。importpandasaspddf_obj=pd.DataFrame({'a':[1,2,3,4,5],

'b':[6,7,8,9,10],

'c':[11,12,13,14,15]},

index=['Leo','Jack','Alice','Helen','Joe'])group_obj=df_obj.groupby(by=len)foriingroup_obj:print(i)5.2.2

查看分組信息掌握分組信息的查看方式,能夠通過(guò)多種方式查看分組的信息學(xué)習(xí)目標(biāo)5.2.2

查看分組信息無(wú)論是SeriesGroupBy對(duì)象和DataFrameGroupBy對(duì)象,它們其實(shí)都屬于GroupBy對(duì)象。GroupBy對(duì)象其實(shí)是一個(gè)可迭代對(duì)象,無(wú)法通過(guò)直接輸出的方式查看分組信息。如果希望查看分組的信息,除了通過(guò)前面介紹的for語(yǔ)句循環(huán)遍歷之外,還可以通過(guò)GroupBy對(duì)象的屬性或方法查看分組的信息。GroupBy對(duì)象5.2.2

查看分組信息我們也可以通過(guò)訪問(wèn)GroupBy對(duì)象的groups屬性查看分組的信息,該屬性的值是一個(gè)字典,字典中每個(gè)鍵值對(duì)對(duì)應(yīng)一個(gè)分組。通過(guò)groups屬性查看df_gb.groups

5.2.2

查看分組信息若希望獲取一個(gè)分組,則可以通過(guò)GroupBy對(duì)象的get_group()方法實(shí)現(xiàn)。通過(guò)get_group()方法查看df_gb.get_group('A')獲取分組Adf_gb.get_group('B')df_gb.get_group('C')獲取分組B獲取分組C數(shù)據(jù)聚合5.35.3.1

通過(guò)統(tǒng)計(jì)方法聚合數(shù)據(jù)熟悉統(tǒng)計(jì)方法的使用,能夠通過(guò)統(tǒng)計(jì)方法實(shí)現(xiàn)數(shù)據(jù)聚合的功能學(xué)習(xí)目標(biāo)5.3.1

通過(guò)統(tǒng)計(jì)方法聚合數(shù)據(jù)importpandasaspdimportnumpyasnpdf=pd.DataFrame({'key1':['A','A','B','B','A'],

'key2':['one','two','one','two','one'],

'data1':[2,3,4,6,8],

'data2':[3,5,np.nan,3,7]})group_obj=df.groupby('key1')group_obj.mean()前面介紹過(guò)pandas的統(tǒng)計(jì)方法,例如,用于獲取最大值和最小值的max()和mix()、求平均數(shù)的mean()等,這些方法可以直接應(yīng)用到分組,對(duì)分組的數(shù)據(jù)進(jìn)行聚合操作。5.3.1

通過(guò)統(tǒng)計(jì)方法聚合數(shù)據(jù)在進(jìn)行聚合操作時(shí),如果分組的數(shù)據(jù)中有缺失值NaN,那么會(huì)自動(dòng)忽略NaN值。5.3.2

通過(guò)agg()聚合數(shù)據(jù)熟悉agg()方法的使用,能夠通過(guò)agg()方法實(shí)現(xiàn)數(shù)據(jù)聚合的功能學(xué)習(xí)目標(biāo)5.3.2

通過(guò)agg()聚合數(shù)據(jù)語(yǔ)法格式除了直接使用統(tǒng)計(jì)方法聚合數(shù)據(jù)之外,我們還可以使用agg()方法聚合數(shù)據(jù),該方法既支持內(nèi)置函數(shù)也支持自定義函數(shù),同時(shí)可以將這些函數(shù)作用于不同的行或列。agg(func=None,

axis=0,

*args,

**kwargs)func:用于聚合數(shù)據(jù)的函數(shù),該參數(shù)的取值可以是匿名函數(shù)、函數(shù)名或方法名、包含函數(shù)名或方法名的列表或字典。axis:表示函數(shù)被應(yīng)用到行或列,該參數(shù)支持0(默認(rèn)值)或'index'和1或'columns'這幾種取值,其中0或'index'表示將函數(shù)應(yīng)用到每一列;1或'columns'表示將函數(shù)應(yīng)用到每一行。5.3.2

通過(guò)agg()聚合數(shù)據(jù)語(yǔ)法格式除了直接使用統(tǒng)計(jì)方法聚合數(shù)據(jù)之外,我們還可以使用agg()方法聚合數(shù)據(jù),該方法既支持內(nèi)置函數(shù)也支持自定義函數(shù),同時(shí)可以將這些函數(shù)作用于不同的行或列?!酆蠑?shù)據(jù)的函數(shù)可以是前面提過(guò)的統(tǒng)計(jì)方法,也可以是用戶自定義的函數(shù)。※我們?cè)谑褂胊gg()方法聚合分組數(shù)據(jù)時(shí),不僅可以讓一個(gè)函數(shù)作用于分組數(shù)據(jù)的所有行或列,還可以讓多個(gè)函數(shù)作用于分組數(shù)據(jù)的所有行或列,甚至可以讓不同函數(shù)作用于分組數(shù)據(jù)的不同的行或列。agg(func=None,

axis=0,

*args,

**kwargs)5.3.2

通過(guò)agg()聚合數(shù)據(jù)所有列應(yīng)用一個(gè)函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時(shí),若給參數(shù)func傳入的值是一個(gè)匿名函數(shù)或函數(shù)名,不給axis參數(shù)傳值,則此時(shí)會(huì)讓分組數(shù)據(jù)的所有列應(yīng)用這個(gè)函數(shù),并執(zhí)行相應(yīng)的操作。importnumpyasnpfrompandasimportDataFrame,Seriesdf_obj=DataFrame(np.arange(36).reshape((6,6)),

columns=list('abcdef'))df_obj['key']=Series(list('aaabbb'),name='key')group_obj=df_obj.groupby('key')group_obj.agg(sum)5.3.2

通過(guò)agg()聚合數(shù)據(jù)所有列應(yīng)用一個(gè)函數(shù)當(dāng)然,我們?cè)谑褂胊gg()方法時(shí)也可以傳入自定義的函數(shù)。例如,定義一個(gè)用來(lái)計(jì)算極差值(極差值=最大值–最小值)的函數(shù),使分組的所有列應(yīng)用該函數(shù)計(jì)算極差值。defmy_range(arr):returnarr.max()-arr.min()group_obj.agg(my_range)5.3.2

通過(guò)agg()聚合數(shù)據(jù)所有列應(yīng)用多個(gè)函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時(shí),若給參數(shù)func傳入的值是一個(gè)包含函數(shù)名的列表,不給axis參數(shù)傳值,則此時(shí)會(huì)讓分組數(shù)據(jù)的所有列應(yīng)用多個(gè)函數(shù),并執(zhí)行相應(yīng)的操作。group_obj.agg([sum,my_range])

abc...f

summy_rangesummy_rangesummy_range...summy_rangekeya

181221122412...3312b721275127812...8712內(nèi)層索引是函數(shù)的名稱(chēng)5.3.2

通過(guò)agg()聚合數(shù)據(jù)所有列應(yīng)用多個(gè)函數(shù)如果函數(shù)名起的不夠見(jiàn)名知意,那么不能很好地辨別出每列數(shù)據(jù)代表的含義。pandas的設(shè)計(jì)者已經(jīng)考慮到這一點(diǎn),它允許我們?cè)趹?yīng)用函數(shù)的同時(shí)給函數(shù)指定名稱(chēng),格式為(名稱(chēng),函數(shù)名)。group_obj.agg([('和',sum),('極差',my_range)])

abcdef

極差

極差

極差

極差

極差

極差keya181221122412271230123312b721275127812811284128712內(nèi)層索引是給函數(shù)另外指定的名稱(chēng)5.3.2

通過(guò)agg()聚合數(shù)據(jù)不同列應(yīng)用不同函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時(shí),若給參數(shù)func傳入的值是一個(gè)字典,不給axis參數(shù)傳值,則可以讓分組的一列應(yīng)用一個(gè)函數(shù),另一列應(yīng)用另一個(gè)函數(shù),并執(zhí)行相應(yīng)的操作。字典有著一定的格式要求,字典的鍵是分組的列索引,字典的值是函數(shù)名或包含函數(shù)名的列表。group_obj.agg({'a':'sum','b':'mean','c':my_range})給a列應(yīng)用sum()函數(shù),通過(guò)該函數(shù)計(jì)算該列數(shù)據(jù)的和給b列應(yīng)用mean()函數(shù),通過(guò)該函數(shù)計(jì)算該列數(shù)據(jù)的平均數(shù)給c列應(yīng)用my_range()函數(shù),通過(guò)該函數(shù)計(jì)算該列數(shù)據(jù)的極差分組級(jí)運(yùn)算5.45.4.1

數(shù)據(jù)轉(zhuǎn)換掌握transform()方法的使用,能夠通過(guò)transform()方法實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換的操作學(xué)習(xí)目標(biāo)5.4.1

數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)轉(zhuǎn)換是pandas中強(qiáng)大的功能之一,它可以對(duì)分組執(zhí)行一些匯總操作,且不改變分組之前的對(duì)象形狀,使轉(zhuǎn)換后對(duì)象的形狀與分組前對(duì)象的形狀保持一致。5.4.1

數(shù)據(jù)轉(zhuǎn)換語(yǔ)法格式transform()方法可以將一個(gè)函數(shù)應(yīng)用在分組上,對(duì)分組的列執(zhí)行相應(yīng)的操作。transform(func,

*args,

engine=None,

engine_kwargs=None,

**kwargs)func:表示每個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論