【Python】GroupBy:数据聚合与分组运算
生活随笔
收集整理的這篇文章主要介紹了
【Python】GroupBy:数据聚合与分组运算
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【博客地址】:https://blog.csdn.net/sunyaowu315
【博客大綱地址】:https://blog.csdn.net/sunyaowu315/article/details/82905347
python:GroupBy:數(shù)據(jù)聚合與分組運(yùn)算
目錄:
文章目錄
- 目錄: @[toc]
- 一 GroupBy技術(shù)
- 1 對分組進(jìn)行迭代
- 2 選取一個或一組列
- 3 通過字典或Series進(jìn)行分組
- 4 通過函數(shù)進(jìn)行分組
- 5 根據(jù)索引級別進(jìn)行分組
- 二 數(shù)據(jù)聚合
- 1 面向列的多函數(shù)應(yīng)用
- 2 以“無索引”形式返回聚合數(shù)據(jù)
- 三 分組級運(yùn)算和轉(zhuǎn)換
- 1 apply:一般性的“拆分-應(yīng)用-合并”
- 2 分位數(shù)和桶分析
- 1)示例:用特定分組的值填充缺失值
- 2)示例:隨機(jī)采樣和排列
- 3)示例:分組加權(quán)平均數(shù)和相關(guān)系數(shù)
- 4)示例:面向分組的線性回歸
- 四 透視表和交叉表
- 1 透視表
- 2 交叉表
- 五 END
- 目錄: @[toc]
- 一 GroupBy技術(shù)
- 1 對分組進(jìn)行迭代
- 2 選取一個或一組列
- 3 通過字典或Series進(jìn)行分組
- 4 通過函數(shù)進(jìn)行分組
- 5 根據(jù)索引級別進(jìn)行分組
- 二 數(shù)據(jù)聚合
- 1 面向列的多函數(shù)應(yīng)用
- 2 以“無索引”形式返回聚合數(shù)據(jù)
- 三 分組級運(yùn)算和轉(zhuǎn)換
- 1 apply:一般性的“拆分-應(yīng)用-合并”
- 2 分位數(shù)和桶分析
- 1)示例:用特定分組的值填充缺失值
- 2)示例:隨機(jī)采樣和排列
- 3)示例:分組加權(quán)平均數(shù)和相關(guān)系數(shù)
- 4)示例:面向分組的線性回歸
- 四 透視表和交叉表
- 1 透視表
- 2 交叉表
- 五 END
- 對數(shù)據(jù)集進(jìn)行分組并對各組應(yīng)用一個函數(shù)(無論是聚合還是轉(zhuǎn)換),這是數(shù)據(jù)分析工作中的重要環(huán)節(jié)。在將數(shù)據(jù)集準(zhǔn)備好之后,通常的任務(wù)就是計(jì)算分組統(tǒng)計(jì)或生成透視表。pandas提供了一個靈活的groupby功能,它能夠以一種自然的方式對數(shù)據(jù)集進(jìn)行切片、切塊、摘要等操作。
- 關(guān)系型數(shù)據(jù)庫和SQL能夠流行的原因之一就是能夠方便地對數(shù)據(jù)進(jìn)行連接、過濾、轉(zhuǎn)換和聚合等。
- python和pandas強(qiáng)大的能力,有助于執(zhí)行更復(fù)雜的分組運(yùn)算,如:
- 根據(jù)一個或多個鍵(可以是函數(shù)、數(shù)組或DataFrame列名)拆分pandas對象
- 計(jì)算分組摘要統(tǒng)計(jì),如計(jì)數(shù)、平均值、標(biāo)準(zhǔn)差或用戶自定義函數(shù)
- 對DataFrame的列應(yīng)用各種各樣的函數(shù)
- 應(yīng)用組內(nèi)轉(zhuǎn)換或其他函數(shù),如規(guī)格化、線性回歸、排名或選取子集等
- 計(jì)算透視表或交叉表等
- 執(zhí)行分位數(shù)分析以及其他分組分析
一 GroupBy技術(shù)
- split-apply-combine(拆分-應(yīng)用-合并),基本描述了groupby的整個過程。分組運(yùn)算的第一個階段,pandas對象中的數(shù)據(jù)會根據(jù)提供的鍵被拆分為多組,拆分操作是在對象的特定軸上執(zhí)行的;然后將一個函數(shù)應(yīng)用在各個分組并產(chǎn)生一個新值;最后,所有這些函數(shù)的執(zhí)行結(jié)果會被合并到最終的結(jié)果對象中。
- 分組鍵可以有多種形式,且類型不必相同:
- 列表或數(shù)組,其長度與待分組的軸一樣
- 表示DataFrame某個列名的值
- 字典或Series,給出待分組軸上的值與分組名之間的對應(yīng)關(guān)系
- 函數(shù),用于處理軸索引或索引中的各個標(biāo)簽
- 分組產(chǎn)生的變量grouped是一個GroupBy對象,實(shí)際上還沒有進(jìn)行任何計(jì)算,只是含有一些有關(guān)分組鍵的中間數(shù)據(jù)。換句話說,該對象已經(jīng)有了接下來對各分組執(zhí)行運(yùn)算所需的一切信息。數(shù)據(jù)Series根據(jù)分組鍵進(jìn)行了聚合,產(chǎn)生了一個新的Series
- 如果通過兩個鍵對數(shù)據(jù)進(jìn)行分組,得到的Series具有一個層次化索引
- 分組鍵可以為Series,也可以是任意長度的數(shù)組,還可以是列名
- 分組過程中的“麻煩列”會在結(jié)果中被踢出。默認(rèn)情況下,所有數(shù)值列都會被聚合,雖然有時可能會被過濾為一個子集。
- 無論準(zhǔn)備拿groupby干啥,都可能會用到groupby的size方法,它可以返回一個含有分組大小的Series
1 對分組進(jìn)行迭代
- GroupBy對象支持迭代,可以產(chǎn)生一組二元元組(由分組名和數(shù)據(jù)塊組成)
- 對于多重鍵的情況,元組的第一個元素將會是由鍵值組成的元組
- 也可以對這些數(shù)據(jù)片段進(jìn)行任何操作,例如:將這些數(shù)據(jù)片段做成一個字典:
- groupby默認(rèn)是在axis = 0上進(jìn)行分組的,也可以設(shè)置在其他任何軸上進(jìn)行分組
2 選取一個或一組列
- 對于由DataFrame產(chǎn)生的groupby對象,如果用一個或一組列名對其進(jìn)行索引,就能實(shí)現(xiàn)選取部分列進(jìn)行聚合的目的。尤其對于大數(shù)據(jù)集,很可能只需要對部分列進(jìn)行聚合。
3 通過字典或Series進(jìn)行分組
- 通過字典分組只需要將這個字典傳給groupby即可
- Series也有同樣的功能,它可以被看做一個固定大小的映射,pandas會檢查Series以確保其索引跟分組軸是對齊的。
4 通過函數(shù)進(jìn)行分組
- 相較于字典或Series,python函數(shù)在定義分組映射關(guān)系時可以更有創(chuàng)意且更為抽象。任何被當(dāng)做分組鍵的函數(shù)都會在各個索引值上被調(diào)用一次,其返回值就會被用作分組名稱。
- 將函數(shù)跟數(shù)組、列表、字典、Series混合使用也可以,因?yàn)槿魏螙|西最終會被轉(zhuǎn)換為數(shù)組。
5 根據(jù)索引級別進(jìn)行分組
- 層次化索引數(shù)據(jù)集最方便的地方就在于它能夠根據(jù)索引級別進(jìn)行聚合。要實(shí)現(xiàn)該目的,通過leve關(guān)鍵字傳入級別編號或名稱即可。
二 數(shù)據(jù)聚合
- 對于聚合,指的是任何能夠從數(shù)組產(chǎn)生標(biāo)量值的數(shù)據(jù)轉(zhuǎn)換過程。許多常見的諸如mean、sum、count、min等聚合運(yùn)算都有就地計(jì)算數(shù)據(jù)集統(tǒng)計(jì)信息的優(yōu)化實(shí)現(xiàn)。然后,并不只能使用這些方法,可以使用自己發(fā)明的聚合運(yùn)算,還可以調(diào)用分組對象上已經(jīng)定義好的任何方法。
- 如果要使用自己定義的聚合函數(shù),只需將其傳入aggregate或agg方法即可
- 經(jīng)過優(yōu)化的groupby方法:
- count # 分組中非NA值得數(shù)量
- sum # 非NA值的和
- mean # 非NA值的平均數(shù)
- median # 非NA值的算術(shù)中位數(shù)
- std、var # 無偏標(biāo)準(zhǔn)差和方差
- min、max # 非NA值的最小值和最大值
- prod # 非NA值的積
- first、last # 第一個和最后一個非NA值
- 有些方法也可以用在這里,但嚴(yán)格來講,它們并非聚合運(yùn)算。
1 面向列的多函數(shù)應(yīng)用
- 對Series或DataFrame列的聚合運(yùn)算其實(shí)就是使用aggregate(使用自定義函數(shù))或調(diào)用諸如mean、std之類的方法。然后,可以對不同的列使用不同的聚合函數(shù),或一次應(yīng)用多個函數(shù)。
- 如果傳入一組函數(shù)或函數(shù)名,得到的DataFrame的列就會以相應(yīng)的函數(shù)命名
- 并非一定要接受groupby給出的列名,特別是lambda函數(shù),辨識度很低。如果傳入的是一個由(name,function)元組組成的列表,則各元組的第一個元素就會被用作DataFrame的列名(可以將二元元組看做一個有序映射)。
- 對于DataFrame,還可以定義一個應(yīng)用于全部列的函數(shù),或不同的列應(yīng)用不同的函數(shù)。如果DataFrame擁有層次化的列,相當(dāng)于分別對各列進(jìn)行聚合,然后用concat將結(jié)果組合在一起(列名用作keys參數(shù))。
- 想要對不同的列應(yīng)用不同的函數(shù),具體的方法是向agg傳入一個列名映射到函數(shù)的字典。
2 以“無索引”形式返回聚合數(shù)據(jù)
- 可以向groupby傳入as_index = False以禁用由分組鍵組成的索引這一功能。對結(jié)果調(diào)用reset_index也能得到這種形式的結(jié)果。
三 分組級運(yùn)算和轉(zhuǎn)換
- 聚合只不過是分組運(yùn)算的其中一種而已。它是數(shù)據(jù)轉(zhuǎn)換的一個 特例,也就是說,它接受能夠?qū)⒁痪S數(shù)組簡化為標(biāo)量值的函數(shù)。
- transform和apply方法,能夠執(zhí)行更多其他的分組運(yùn)算。
1 apply:一般性的“拆分-應(yīng)用-合并”
- 跟aggregate一樣,transform也是一個有著嚴(yán)格條件的特殊函數(shù):傳入的函數(shù)只能產(chǎn)生兩種結(jié)果,要么產(chǎn)生一個可以廣播的標(biāo)量值,要么產(chǎn)生一個相同大小的結(jié)果數(shù)組。最一般化的groupby方法是apply,apply會將待處理的對象拆分成多個片段,然后對各片段調(diào)用傳入的函數(shù),最后嘗試將各片段組合到一起。
- 如果傳給apply的函數(shù)能夠接受其他參數(shù)或關(guān)鍵字,則可以將這些內(nèi)容放在函數(shù)名后面一并傳入。
- 除一些基本用法外,能否充分發(fā)揮apply的威力很大程度上取決于你的創(chuàng)造力。傳入的那個函數(shù)能做什么全由你說了算,它只需要返回一個pandas對象或標(biāo)量值即可。
- 禁止分組鍵
2 分位數(shù)和桶分析
- pandas有一些能夠根據(jù)指定面元或樣本分位數(shù)將數(shù)據(jù)拆分成多塊的工具(比如cut或qcut)。將這些函數(shù)跟groupby結(jié)合起來,就能非常輕松地實(shí)現(xiàn)對數(shù)據(jù)集的桶(bucket)或分位數(shù)(quantile)分析
1)示例:用特定分組的值填充缺失值
2)示例:隨機(jī)采樣和排列
3)示例:分組加權(quán)平均數(shù)和相關(guān)系數(shù)
4)示例:面向分組的線性回歸
四 透視表和交叉表
1 透視表
- 透視表(pivot_table)是各種電子表格 程序和其他數(shù)據(jù)分析軟件中一種常見的數(shù)據(jù)匯總工具。它根據(jù)一個或多個鍵對數(shù)據(jù)進(jìn)行聚合,并根據(jù)行和列上的分組鍵將數(shù)據(jù)分配到各個矩形區(qū)域中。在python和pandas中,可以通過groupby功能以及層次化索引的重塑運(yùn)算制作透視表。DataFrame有一個pivot_table方法,此外還有一個頂級的pandas.pivot_table函數(shù)。除能為groupby提供便利外,pivot_table還可以添加分項(xiàng)小計(jì)。
- pivot_table的參數(shù)
- ① values # 待聚合的列的名稱,默認(rèn)聚合所有數(shù)值列
- ② rows # 用于分組的列名和其他分組鍵,出現(xiàn)在結(jié)果透視表的行
- ③ cols # 用于分組的列名或其他分組鍵,出現(xiàn)在結(jié)果透視表的列
- ④ aggfunc # 聚合函數(shù)或函數(shù)列表,默認(rèn)為mean,可以是任何對groupby有效的函數(shù)
- ⑤ fill_value # 用于替換結(jié)果表中的缺失值
- ⑥ margins # 添加行、列小計(jì)和總計(jì),默認(rèn)為False
2 交叉表
- 交叉表(crosstab)是一種用于計(jì)算分組頻率的特殊透視表
- 假設(shè)我們想要根據(jù)某兩個特征對數(shù)據(jù)進(jìn)行匯統(tǒng)計(jì)匯總,雖然pivot_table可以實(shí)現(xiàn)該功能,但pandas.crosstab函數(shù)會更加方便。
五 END
總結(jié)
以上是生活随笔為你收集整理的【Python】GroupBy:数据聚合与分组运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】Pandas基础:结构化
- 下一篇: 【Python】merge:数据规整化: