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