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