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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章數據聚合與分組運算《Python數據分析與應用:從數據獲取到可視化(第2版)》學習目標/Target

了解分組與聚合的原理,能夠說出分組與聚合的原理

掌握分組方法的使用,能夠通過groupby()方法按不同標準對數據進行分組

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

熟悉內置統(tǒng)計方法的使用,能夠通過統(tǒng)計方法聚合數據學習目標/Target

掌握agg()方法的使用,能夠通過agg()方法聚合數據

掌握transform()方法的使用,能夠通過transform()方法轉換數據

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

分組與聚合的原理了解分組與聚合的原理,能夠說出分組與聚合的原理學習目標5.1

分組與聚合的原理分組與聚合是數據分析工作中比較常見的操作,它主要根據一定的拆分標準將原數據拆分成若干個分組,然后對每個分組應用統(tǒng)計運算,并把運算后的結果合并到一起,便于用戶對不同分組的數據進行深入解讀。5.1

分組與聚合的原理分組與聚合的流程應用(apply)原數據按照一定的拆分標準被拆分為若干個分組。合并(combine)每個分組應用某個函數或方法進行相應的操作,并產生一個標量值。分組名稱與標量值整合成新的對象。拆分(split)5.1

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

通過groupby()對數據進行分組掌握groupby()方法的使用,能夠通過groupby()方法按照不同的拆分標準對數據進行分組學習目標5.2.1

通過groupby()對數據進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現分組操作的方法groupby(),該方法可以按照不同的拆分標準將數據拆分成若干個分組。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()對數據進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現分組操作的方法groupby(),該方法可以按照不同的拆分標準將數據拆分成若干個分組。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()對數據進行分組語法格式pandas的Series類或DataFrame類中提供了一個用于實現分組操作的方法groupby(),該方法可以按照不同的拆分標準將數據拆分成若干個分組。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)若groupby()方法的調用方是Series類的對象,則該方法的返回值是SeriesGroupBy對象;若groupby()方法的調用方是DataFrame類的對象,則該方法的返回值是DataFrameBy對象。5.2.1

通過groupby()對數據進行分組參數by參數by決定了按照什么樣的標準對數據進行分組,該參數支持多種形式的值,包括列標簽、列表、數組、Series類的對象、字典或函數,其中列表或數組的長度必須與待拆分軸上的數據個數相等。列標簽列表數組Series類對象字典函數5.2.1

通過groupby()對數據進行分組按照列標簽進行分組當使用groupby()方法對數據進行分組時,若給參數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()對數據進行分組按照列標簽進行分組DataFrameGroupBy對象其實是一個可迭代的對象,可以直接使用for語句進行遍歷。forgbindf_gb:print(gb)5.2.1

通過groupby()對數據進行分組按照Series類的對象進行分組當使用groupby()方法對數據進行分組時,若給參數by傳入的值是Series類的對象,此時會根據Series類的對象中的值決定如何分組,若值相同,則需要將原數據中與值位置對應的行拆分成一個分組;若值不同,則需要將原數據中與值位置對應的行自成一個分組。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()對數據進行分組按照Series類的對象進行分組如果Series類對象的索引長度小于原對象的行索引長度,那么在使用groupby()方法進行分組時會怎么樣呢?5.2.1

通過groupby()對數據進行分組按照Series類的對象進行分組如果Series類對象的索引長度小于原對象的行索引長度,那么在使用groupby()方法進行分組時,只會將原對象的部分數據進行分組,而不會將全部的數據進行分組。ser_diff=pd.Series(['a','b','a'])

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

通過groupby()對數據進行分組按照字典進行分組當使用groupby()方法對數據進行分組時,若給參數by傳入的值是字典,此時會將字典的鍵作為原對象行或列的標簽索引,字典的值作為分組的名稱,根據分組名稱與標簽索引的對應關系進行分組。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()對數據進行分組按照函數進行分組當使用groupby()方法對數據進行分組時,若給參數by傳入的值是函數,則會讓被拆分軸上的標簽索引調用一次該函數,并根據返回的值決定如何分組,如果值相同,則會將對應的行或列整合成一組;如果值不同,則會將對應的行或列自成一組。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

查看分組信息掌握分組信息的查看方式,能夠通過多種方式查看分組的信息學習目標5.2.2

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

查看分組信息我們也可以通過訪問GroupBy對象的groups屬性查看分組的信息,該屬性的值是一個字典,字典中每個鍵值對對應一個分組。通過groups屬性查看df_gb.groups

5.2.2

查看分組信息若希望獲取一個分組,則可以通過GroupBy對象的get_group()方法實現。通過get_group()方法查看df_gb.get_group('A')獲取分組Adf_gb.get_group('B')df_gb.get_group('C')獲取分組B獲取分組C數據聚合5.35.3.1

通過統(tǒng)計方法聚合數據熟悉統(tǒng)計方法的使用,能夠通過統(tǒng)計方法實現數據聚合的功能學習目標5.3.1

通過統(tǒng)計方法聚合數據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()、求平均數的mean()等,這些方法可以直接應用到分組,對分組的數據進行聚合操作。5.3.1

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

通過agg()聚合數據熟悉agg()方法的使用,能夠通過agg()方法實現數據聚合的功能學習目標5.3.2

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

axis=0,

*args,

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

通過agg()聚合數據語法格式除了直接使用統(tǒng)計方法聚合數據之外,我們還可以使用agg()方法聚合數據,該方法既支持內置函數也支持自定義函數,同時可以將這些函數作用于不同的行或列?!酆蠑祿暮瘮悼梢允乔懊嫣徇^的統(tǒng)計方法,也可以是用戶自定義的函數?!覀冊谑褂胊gg()方法聚合分組數據時,不僅可以讓一個函數作用于分組數據的所有行或列,還可以讓多個函數作用于分組數據的所有行或列,甚至可以讓不同函數作用于分組數據的不同的行或列。agg(func=None,

axis=0,

*args,

**kwargs)5.3.2

通過agg()聚合數據所有列應用一個函數當使用agg()方法聚合數據時,若給參數func傳入的值是一個匿名函數或函數名,不給axis參數傳值,則此時會讓分組數據的所有列應用這個函數,并執(zhí)行相應的操作。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()聚合數據所有列應用一個函數當然,我們在使用agg()方法時也可以傳入自定義的函數。例如,定義一個用來計算極差值(極差值=最大值–最小值)的函數,使分組的所有列應用該函數計算極差值。defmy_range(arr):returnarr.max()-arr.min()group_obj.agg(my_range)5.3.2

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

abc...f

summy_rangesummy_rangesummy_range...summy_rangekeya

181221122412...3312b721275127812...8712內層索引是函數的名稱5.3.2

通過agg()聚合數據所有列應用多個函數如果函數名起的不夠見名知意,那么不能很好地辨別出每列數據代表的含義。pandas的設計者已經考慮到這一點,它允許我們在應用函數的同時給函數指定名稱,格式為(名稱,函數名)。group_obj.agg([('和',sum),('極差',my_range)])

abcdef

極差

極差

極差

極差

極差

極差keya181221122412271230123312b721275127812811284128712內層索引是給函數另外指定的名稱5.3.2

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

數據轉換掌握transform()方法的使用,能夠通過transform()方法實現數據轉換的操作學習目標5.4.1

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

數據轉換語法格式transform()方法可以將一個函數應用在分組上,對分組的列執(zhí)行相應的操作。transform(func,

*args,

engine=None,

engine_kwargs=None,

**kwargs)func:表示每個

溫馨提示

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

評論

0/150

提交評論