版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章數(shù)據(jù)聚合與分組運算《Python數(shù)據(jù)分析與應(yīng)用:從數(shù)據(jù)獲取到可視化(第2版)》學(xué)習(xí)目標/Target
了解分組與聚合的原理,能夠說出分組與聚合的原理
掌握分組方法的使用,能夠通過groupby()方法按不同標準對數(shù)據(jù)進行分組
掌握分組信息的查看方式,能夠通過多種方式查看分組的信息
熟悉內(nèi)置統(tǒng)計方法的使用,能夠通過統(tǒng)計方法聚合數(shù)據(jù)學(xué)習(xí)目標/Target
掌握agg()方法的使用,能夠通過agg()方法聚合數(shù)據(jù)
掌握transform()方法的使用,能夠通過transform()方法轉(zhuǎn)換數(shù)據(jù)
掌握apply()方法的使用,能夠通過apply()方法聚合數(shù)據(jù)章節(jié)概述/Summary在進行數(shù)據(jù)分析工作時,我們可能會遇到這樣的場景:現(xiàn)在要求從日志數(shù)據(jù)中找出每天訪問次數(shù)最多的IP,這時需要先把所有的日志數(shù)據(jù)按天拆分成每天的日志數(shù)據(jù),再對每天的日志數(shù)據(jù)進行統(tǒng)計運算,最后把所有的統(tǒng)計結(jié)果放到一起,這樣便完成了最初設(shè)定的要求,這個過程中用到的思想就是分組與聚合——數(shù)據(jù)重組后再合并。pandas中提供了一些用于分組與聚合的方法,另外還提供一些其他的分組級運算,本章將針對這些內(nèi)容進行詳細地講解。目錄/Contents01分組與聚合的原理02分組操作03數(shù)據(jù)聚合04分組級運算05案例:籃球運動員信息分析分組與聚合的原理5.15.1
分組與聚合的原理了解分組與聚合的原理,能夠說出分組與聚合的原理學(xué)習(xí)目標5.1
分組與聚合的原理分組與聚合是數(shù)據(jù)分析工作中比較常見的操作,它主要根據(jù)一定的拆分標準將原數(shù)據(jù)拆分成若干個分組,然后對每個分組應(yīng)用統(tǒng)計運算,并把運算后的結(jié)果合并到一起,便于用戶對不同分組的數(shù)據(jù)進行深入解讀。5.1
分組與聚合的原理分組與聚合的流程應(yīng)用(apply)原數(shù)據(jù)按照一定的拆分標準被拆分為若干個分組。合并(combine)每個分組應(yīng)用某個函數(shù)或方法進行相應(yīng)的操作,并產(chǎn)生一個標量值。分組名稱與標量值整合成新的對象。拆分(split)5.1
分組與聚合的原理分組與聚合的流程分組操作5.25.2.1
通過groupby()對數(shù)據(jù)進行分組掌握groupby()方法的使用,能夠通過groupby()方法按照不同的拆分標準對數(shù)據(jù)進行分組學(xué)習(xí)目標5.2.1
通過groupby()對數(shù)據(jù)進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標準將數(shù)據(jù)拆分成若干個分組。groupby(by=None,
axis=0,
level=None,
as_index=True,
sort=True,
group_keys=True,
squeeze=NoDefault.no_default,
observed=False,
dropna=True)by:用于確定分組的拆分標準。axis:表示沿著行或列拆分,取值可以為0(默認)或‘index’和1或‘columns’,其中0或‘index’代表沿著行拆分,1或‘columns’代表沿著列拆分。5.2.1
通過groupby()對數(shù)據(jù)進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標準將數(shù)據(jù)拆分成若干個分組。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:表示是否返回以分組標簽作為索引的對象輸出,默認值為True。sort:表示是否對分組標簽進行排序,默認值為True。5.2.1
通過groupby()對數(shù)據(jù)進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現(xiàn)分組操作的方法groupby(),該方法可以按照不同的拆分標準將數(shù)據(jù)拆分成若干個分組。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類的對象,則該方法的返回值是SeriesGroupBy對象;若groupby()方法的調(diào)用方是DataFrame類的對象,則該方法的返回值是DataFrameBy對象。5.2.1
通過groupby()對數(shù)據(jù)進行分組參數(shù)by參數(shù)by決定了按照什么樣的標準對數(shù)據(jù)進行分組,該參數(shù)支持多種形式的值,包括列標簽、列表、數(shù)組、Series類的對象、字典或函數(shù),其中列表或數(shù)組的長度必須與待拆分軸上的數(shù)據(jù)個數(shù)相等。列標簽列表數(shù)組Series類對象字典函數(shù)5.2.1
通過groupby()對數(shù)據(jù)進行分組按照列標簽進行分組當(dāng)使用groupby()方法對數(shù)據(jù)進行分組時,若給參數(shù)by傳入的值是列標簽,此時會將該列中值相同的行拆分出來整合成一個分組,值不同的行拆分出來自成為一個分組。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
通過groupby()對數(shù)據(jù)進行分組按照列標簽進行分組DataFrameGroupBy對象其實是一個可迭代的對象,可以直接使用for語句進行遍歷。forgbindf_gb:print(gb)5.2.1
通過groupby()對數(shù)據(jù)進行分組按照Series類的對象進行分組當(dāng)使用groupby()方法對數(shù)據(jù)進行分組時,若給參數(shù)by傳入的值是Series類的對象,此時會根據(jù)Series類的對象中的值決定如何分組,若值相同,則需要將原數(shù)據(jù)中與值位置對應(yīng)的行拆分成一個分組;若值不同,則需要將原數(shù)據(jù)中與值位置對應(yīng)的行自成一個分組。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
通過groupby()對數(shù)據(jù)進行分組按照Series類的對象進行分組如果Series類對象的索引長度小于原對象的行索引長度,那么在使用groupby()方法進行分組時會怎么樣呢?5.2.1
通過groupby()對數(shù)據(jù)進行分組按照Series類的對象進行分組如果Series類對象的索引長度小于原對象的行索引長度,那么在使用groupby()方法進行分組時,只會將原對象的部分數(shù)據(jù)進行分組,而不會將全部的數(shù)據(jù)進行分組。ser_diff=pd.Series(['a','b','a'])
group_obj=df_obj.groupby(by=ser_diff)foriingroup_obj:print(i)5.2.1
通過groupby()對數(shù)據(jù)進行分組按照字典進行分組當(dāng)使用groupby()方法對數(shù)據(jù)進行分組時,若給參數(shù)by傳入的值是字典,此時會將字典的鍵作為原對象行或列的標簽索引,字典的值作為分組的名稱,根據(jù)分組名稱與標簽索引的對應(yīng)關(guā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
通過groupby()對數(shù)據(jù)進行分組按照函數(shù)進行分組當(dāng)使用groupby()方法對數(shù)據(jù)進行分組時,若給參數(shù)by傳入的值是函數(shù),則會讓被拆分軸上的標簽索引調(diào)用一次該函數(shù),并根據(jù)返回的值決定如何分組,如果值相同,則會將對應(yīng)的行或列整合成一組;如果值不同,則會將對應(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
查看分組信息掌握分組信息的查看方式,能夠通過多種方式查看分組的信息學(xué)習(xí)目標5.2.2
查看分組信息無論是SeriesGroupBy對象和DataFrameGroupBy對象,它們其實都屬于GroupBy對象。GroupBy對象其實是一個可迭代對象,無法通過直接輸出的方式查看分組信息。如果希望查看分組的信息,除了通過前面介紹的for語句循環(huán)遍歷之外,還可以通過GroupBy對象的屬性或方法查看分組的信息。GroupBy對象5.2.2
查看分組信息我們也可以通過訪問GroupBy對象的groups屬性查看分組的信息,該屬性的值是一個字典,字典中每個鍵值對對應(yīng)一個分組。通過groups屬性查看df_gb.groups
5.2.2
查看分組信息若希望獲取一個分組,則可以通過GroupBy對象的get_group()方法實現(xiàn)。通過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
通過統(tǒng)計方法聚合數(shù)據(jù)熟悉統(tǒng)計方法的使用,能夠通過統(tǒng)計方法實現(xiàn)數(shù)據(jù)聚合的功能學(xué)習(xí)目標5.3.1
通過統(tǒng)計方法聚合數(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()前面介紹過pandas的統(tǒng)計方法,例如,用于獲取最大值和最小值的max()和mix()、求平均數(shù)的mean()等,這些方法可以直接應(yīng)用到分組,對分組的數(shù)據(jù)進行聚合操作。5.3.1
通過統(tǒng)計方法聚合數(shù)據(jù)在進行聚合操作時,如果分組的數(shù)據(jù)中有缺失值NaN,那么會自動忽略NaN值。5.3.2
通過agg()聚合數(shù)據(jù)熟悉agg()方法的使用,能夠通過agg()方法實現(xiàn)數(shù)據(jù)聚合的功能學(xué)習(xí)目標5.3.2
通過agg()聚合數(shù)據(jù)語法格式除了直接使用統(tǒng)計方法聚合數(shù)據(jù)之外,我們還可以使用agg()方法聚合數(shù)據(jù),該方法既支持內(nèi)置函數(shù)也支持自定義函數(shù),同時可以將這些函數(shù)作用于不同的行或列。agg(func=None,
axis=0,
*args,
**kwargs)func:用于聚合數(shù)據(jù)的函數(shù),該參數(shù)的取值可以是匿名函數(shù)、函數(shù)名或方法名、包含函數(shù)名或方法名的列表或字典。axis:表示函數(shù)被應(yīng)用到行或列,該參數(shù)支持0(默認值)或'index'和1或'columns'這幾種取值,其中0或'index'表示將函數(shù)應(yīng)用到每一列;1或'columns'表示將函數(shù)應(yīng)用到每一行。5.3.2
通過agg()聚合數(shù)據(jù)語法格式除了直接使用統(tǒng)計方法聚合數(shù)據(jù)之外,我們還可以使用agg()方法聚合數(shù)據(jù),該方法既支持內(nèi)置函數(shù)也支持自定義函數(shù),同時可以將這些函數(shù)作用于不同的行或列?!酆蠑?shù)據(jù)的函數(shù)可以是前面提過的統(tǒng)計方法,也可以是用戶自定義的函數(shù)?!覀冊谑褂胊gg()方法聚合分組數(shù)據(jù)時,不僅可以讓一個函數(shù)作用于分組數(shù)據(jù)的所有行或列,還可以讓多個函數(shù)作用于分組數(shù)據(jù)的所有行或列,甚至可以讓不同函數(shù)作用于分組數(shù)據(jù)的不同的行或列。agg(func=None,
axis=0,
*args,
**kwargs)5.3.2
通過agg()聚合數(shù)據(jù)所有列應(yīng)用一個函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時,若給參數(shù)func傳入的值是一個匿名函數(shù)或函數(shù)名,不給axis參數(shù)傳值,則此時會讓分組數(shù)據(jù)的所有列應(yīng)用這個函數(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
通過agg()聚合數(shù)據(jù)所有列應(yīng)用一個函數(shù)當(dāng)然,我們在使用agg()方法時也可以傳入自定義的函數(shù)。例如,定義一個用來計算極差值(極差值=最大值–最小值)的函數(shù),使分組的所有列應(yīng)用該函數(shù)計算極差值。defmy_range(arr):returnarr.max()-arr.min()group_obj.agg(my_range)5.3.2
通過agg()聚合數(shù)據(jù)所有列應(yīng)用多個函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時,若給參數(shù)func傳入的值是一個包含函數(shù)名的列表,不給axis參數(shù)傳值,則此時會讓分組數(shù)據(jù)的所有列應(yīng)用多個函數(shù),并執(zhí)行相應(yīng)的操作。group_obj.agg([sum,my_range])
abc...f
summy_rangesummy_rangesummy_range...summy_rangekeya
181221122412...3312b721275127812...8712內(nèi)層索引是函數(shù)的名稱5.3.2
通過agg()聚合數(shù)據(jù)所有列應(yīng)用多個函數(shù)如果函數(shù)名起的不夠見名知意,那么不能很好地辨別出每列數(shù)據(jù)代表的含義。pandas的設(shè)計者已經(jīng)考慮到這一點,它允許我們在應(yīng)用函數(shù)的同時給函數(shù)指定名稱,格式為(名稱,函數(shù)名)。group_obj.agg([('和',sum),('極差',my_range)])
abcdef
和
極差
和
極差
和
極差
和
極差
和
極差
和
極差keya181221122412271230123312b721275127812811284128712內(nèi)層索引是給函數(shù)另外指定的名稱5.3.2
通過agg()聚合數(shù)據(jù)不同列應(yīng)用不同函數(shù)當(dāng)使用agg()方法聚合數(shù)據(jù)時,若給參數(shù)func傳入的值是一個字典,不給axis參數(shù)傳值,則可以讓分組的一列應(yīng)用一個函數(shù),另一列應(yīng)用另一個函數(shù),并執(zhí)行相應(yīng)的操作。字典有著一定的格式要求,字典的鍵是分組的列索引,字典的值是函數(shù)名或包含函數(shù)名的列表。group_obj.agg({'a':'sum','b':'mean','c':my_range})給a列應(yīng)用sum()函數(shù),通過該函數(shù)計算該列數(shù)據(jù)的和給b列應(yīng)用mean()函數(shù),通過該函數(shù)計算該列數(shù)據(jù)的平均數(shù)給c列應(yīng)用my_range()函數(shù),通過該函數(shù)計算該列數(shù)據(jù)的極差分組級運算5.45.4.1
數(shù)據(jù)轉(zhuǎn)換掌握transform()方法的使用,能夠通過transform()方法實現(xiàn)數(shù)據(jù)轉(zhuǎn)換的操作學(xué)習(xí)目標5.4.1
數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)轉(zhuǎn)換是pandas中強大的功能之一,它可以對分組執(zhí)行一些匯總操作,且不改變分組之前的對象形狀,使轉(zhuǎn)換后對象的形狀與分組前對象的形狀保持一致。5.4.1
數(shù)據(jù)轉(zhuǎn)換語法格式transform()方法可以將一個函數(shù)應(yīng)用在分組上,對分組的列執(zhí)行相應(yīng)的操作。transform(func,
*args,
engine=None,
engine_kwargs=None,
**kwargs)func:表示每個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國臺式讀寫機具數(shù)據(jù)監(jiān)測研究報告
- 2025年中國錫制工藝品市場調(diào)查研究報告
- 2025年中國嬰兒推車玩具市場調(diào)查研究報告
- 2025年中國醫(yī)用三元混含氣體市場調(diào)查研究報告
- 2025至2031年中國高速牙科球軸承行業(yè)投資前景及策略咨詢研究報告
- 基于鈮酸鋰薄膜的高性能光柵耦合器研究
- 富水地層隧道裂隙圍巖各向異性滲流及涌水量預(yù)測研究
- 2025年度個人藝術(shù)創(chuàng)作師雇傭合同3篇
- 2025年度寵物運輸行業(yè)環(huán)保技術(shù)創(chuàng)新合同模板4篇
- 二零二四年度學(xué)校教師教育創(chuàng)新與創(chuàng)業(yè)合同3篇
- 2024年高純氮化鋁粉體項目可行性分析報告
- 安檢人員培訓(xùn)
- IT硬件系統(tǒng)集成項目質(zhì)量管理方案
- 《容幼穎悟》2020年江蘇泰州中考文言文閱讀真題(含答案與翻譯)
- 水上水下作業(yè)應(yīng)急預(yù)案
- API520-安全閥計算PART1(中文版)
- 2023年廣東省廣州地鐵城際鐵路崗位招聘筆試參考題庫附帶答案詳解
- 商務(wù)提成辦法
- 直流電機電樞繞組簡介
- GB/T 19889.5-2006聲學(xué)建筑和建筑構(gòu)件隔聲測量第5部分:外墻構(gòu)件和外墻空氣聲隔聲的現(xiàn)場測量
- 《土地寶懺》2019版定稿
評論
0/150
提交評論