第六課 Pandas 進(jìn)階
* 本課主要內(nèi)容:數(shù)據(jù)的分組和聚合
01.分組和聚合的思想
- 通過統(tǒng)計(jì)多篇文章詞頻的例子祠乃,來了解分組和聚合的思想方法。
02.鳶尾花案例
- groupby 方法
- agg方法
- apply方法
03.嬰兒姓名案例
- 每年最流行的男孩女孩名字所占的百分比變化趨勢(shì)如何?
- 為何這一趨勢(shì)逐年降低的?
01.分組和聚合的思想
數(shù)據(jù)的分組&聚合 -- 什么是groupby 技術(shù)?
- 在數(shù)據(jù)分析中,我們往往需要在將數(shù)據(jù)拆分饺窿,在每一個(gè)特定的組里進(jìn)行運(yùn)算鲫咽。比如根據(jù)教育水平和年齡段計(jì)算某個(gè)城市的工作人口的平均收入姨伤。
- pandas中的groupby提供了一個(gè)高效的數(shù)據(jù)的分組運(yùn)算劫恒。
- 我們通過一個(gè)或者多個(gè)分類變量將數(shù)據(jù)拆分贩幻,然后分別在拆分以后的數(shù)據(jù)上進(jìn)行需要的計(jì)算
-
我們可以把上述過程理解為三部:
*1.拆分?jǐn)?shù)據(jù)(split)
*2.應(yīng)用某個(gè)函數(shù)(apply)
*3.匯總計(jì)算結(jié)果(aggregate)
Paste_Image.png
寫成代碼的話:
Paste_Image.png
02.案例一 :Iris鳶尾花數(shù)據(jù)集
a.導(dǎo)入pandas包
* import pandas as pd
b.導(dǎo)入鳶尾花數(shù)據(jù)
* Iris = pd.read_csv( 'iris.txt' )
*iris.head() # 前五行數(shù)據(jù)
Paste_Image.png
c. 統(tǒng)計(jì)每個(gè)品種的數(shù)據(jù)量
* iris.species.value_counts()
Paste_Image.png
2.1 分組運(yùn)算 groupby 方法 -- 使用內(nèi)置函數(shù)
鳶尾花數(shù)據(jù)中包括了3個(gè)不同的品種150個(gè)觀測(cè)對(duì)象,數(shù)據(jù)分析中我們往往對(duì)一個(gè)品種的特性更感興趣而不是每一個(gè)個(gè)體的數(shù)據(jù)描述兼贸。
假如一個(gè)植物園管理員提出這個(gè)問題:
按品種劃分段直,每個(gè)品種的花萼,花瓣的長度和寬度的最大值分別是多少溶诞?
我們應(yīng)該如何回答?
使用上述groupby的思想决侈,我們可以將數(shù)據(jù)劃分為3個(gè)小塊螺垢,每個(gè)小塊包含50個(gè)觀測(cè)數(shù)據(jù)。然后使用max函數(shù)得到各個(gè)測(cè)量值的最大值赖歌,然后進(jìn)行匯總枉圃。
Paste_Image.png
* size方法查看每個(gè)group的大小*
* size方法查看每個(gè)group的大小*
2.2 使用自定義函數(shù)進(jìn)行聚合運(yùn)算 -- agg 方法
- 當(dāng)計(jì)算變得復(fù)雜時(shí),內(nèi)置函數(shù)可能無法處理
- 我們需要自定義一個(gè)函數(shù)來進(jìn)行計(jì)算, 傳入一個(gè)數(shù)組做參數(shù)庐冯,返回一個(gè)標(biāo)量的結(jié)果孽亲。
- groupby對(duì)象的agg/aggregate方法可以實(shí)現(xiàn)上述功能。
計(jì)算每個(gè)品種所有屬性(花瓣展父、花萼的長度和寬度)數(shù)值的跨度范圍返劲,即最大值減去最小值
Paste_Image.png
我們還可以同時(shí)引用多個(gè)函數(shù),將函數(shù)名字放入一個(gè)列表即可栖茉,內(nèi)置函數(shù)名需要用引號(hào)
Paste_Image.png
針對(duì)不同的列篮绿,應(yīng)用不同的聚合函數(shù)
Paste_Image.png
2.3 更廣泛的分組運(yùn)算 -- apply方法
- agg 方法將一個(gè)函數(shù)使用在一個(gè)數(shù)列上,然后返回一個(gè)標(biāo)量的值吕漂。
- apply 是一個(gè)更一般化的方法:將一個(gè)數(shù)據(jù)分拆-應(yīng)用-匯總
提取每個(gè)品種前n個(gè)觀測(cè)值作為一個(gè)樣本
Paste_Image.png
使用agg會(huì)報(bào)錯(cuò)亲配,試一下apply方法:
Paste_Image.png
階段小結(jié):
- 上面的例題主要學(xué)習(xí)了如何將數(shù)據(jù)根據(jù)某些條件分拆為幾個(gè)子數(shù)據(jù),然后在每個(gè)子數(shù)據(jù)上進(jìn)行計(jì)算從而得到所要的結(jié)果惶凝。
- 主要思想是分拆-應(yīng)用-匯總吼虎。
- 對(duì)于一些簡單的計(jì)算,比如最大值最小值的計(jì)算苍鲜,我們可以直接使用groupby之后采用相應(yīng)的內(nèi)置方法思灰。
- 對(duì)于一些更為復(fù)雜的計(jì)算,我們需要自己定義函數(shù)然后應(yīng)用到拆分后的子數(shù)據(jù)上坡贺。根據(jù)具體要求來決定使用agg方法還是apply方法官辈。
03.案例2:美國嬰兒名字?jǐn)?shù)據(jù)
- 數(shù)據(jù)來源: https://www.ssa.gov/oact/babynames/limits.html
- 包括1880至2016所有年份出生的嬰兒名箱舞。
Paste_Image.png
運(yùn)行以后的結(jié)果(前五行)
Paste_Image.png
利用info查看數(shù)據(jù)信息:
Paste_Image.png
根據(jù)多個(gè)屬性分組數(shù)據(jù)
Paste_Image.png
在不同的年份不同性別中,計(jì)算每個(gè)名字所占的百分比
Paste_Image.png
增加排序(rank)
Paste_Image.png
每年最流行的男孩女孩名字所占的百分比變化趨勢(shì)如何拳亿?
- 思路:可以使用matlibplot畫出rank1的男孩女孩的名字每年所占總?cè)藬?shù)的百分比
使用Matplotlib工具繪圖
- 下面的線圖(line plot)由matlibplot實(shí)現(xiàn)晴股,我們可以逐漸添加比如圖標(biāo)題,x軸和y軸的標(biāo)簽等等使圖形更加美觀
Paste_Image.png
繪制圖形
Paste_Image.png
女生的名字流行折線圖
Paste_Image.png
為什么歷史上最流行的男孩女孩名字所占的比重逐年降低?
Paste_Image.png
使用to_farme將series轉(zhuǎn)化為DataFrame格式
Paste_Image.png
使用reset_index()
Paste_Image.png
作圖
Paste_Image.png
運(yùn)行
Paste_Image.png
結(jié)論:可選擇的名字逐年增加肺魁,所以流行名字的占比逐年降低
- 從數(shù)據(jù)中快速看到一個(gè)現(xiàn)象是我們學(xué)習(xí)數(shù)據(jù)分析的一個(gè)必要技能电湘,讓數(shù)據(jù)告訴我們發(fā)生的現(xiàn)象。