日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(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
  • 對(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ù)塊組成)
for name,group in df.groupby(key1) print(name) print(group)
  • 對(duì)于多重鍵的情況,元組的第一個(gè)元素將會(huì)是由鍵值組成的元組
for (k1,k2) ,group in df.groupby(['key1','key2']) print(k1,k2) print(group)
  • 也可以對(duì)這些數(shù)據(jù)片段進(jìn)行任何操作,例如:將這些數(shù)據(jù)片段做成一個(gè)字典:
pieces = dict(list(df.groupby('key1'))) peices['b']
  • 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)行聚合。
df.groupby(['key1','key2'])[['data2']].mean()

3 通過(guò)字典或Series進(jìn)行分組

  • 通過(guò)字典分組只需要將這個(gè)字典傳給groupby即可
people = DataFrame(np.random.randn(5,5),columns = ['a','b','c','d','e'],idnex = ['joe','steve','wes','jim','travis']) people.ix[2:3,['b','c']] = np.nan #添加幾個(gè)缺失值 mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'} by_column = people.groupby(mapping,axis = 1)
  • 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)即可。
columns = pd.MultiIndex.form_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names = ['cty','tenor']) hier_df = DataFrame(np.random.randn(4,5),columns = columns) hier_df.groupby(level = 'cyt',axis = 1).count

二 數(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ù)名后面一并傳入。
tips.groupby(['smoker','day']).apply(top,n = 1,column = 'tptal_bill')
  • 除一些基本用法外,能否充分發(fā)揮apply的威力很大程度上取決于你的創(chuàng)造力。傳入的那個(gè)函數(shù)能做什么全由你說(shuō)了算,它只需要返回一個(gè)pandas對(duì)象或標(biāo)量值即可。
result = tips.groupby('smoker')['tip_pit'].describe()
  • 禁止分組鍵

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
tips.pivot_table('tip_pct',rows = ['sex','smoker'],cols = 'day',aggfunc = len,margins = True)

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。