5-Pandas數據分組與聚合(df.Groupby())


GroupBy技術是對於數據進行分組計算並將各組計算結果合並的一項技術,包括以下3個過程:

  1. 拆分(Spliting):即將數據進行分組
  2. 應用(Applying):對每組應用函數進行計算
  3. 合並(Combining):將計算結果進行數據聚合

 

使用GroupBy()可以沿着任意軸進行分組,並且將分組依據的鍵作為每組的組名,有一下3種用法:

  1. df.groupby(key)
  2. df.groupby(key,axis=1)
  3. df.groupby([key1,key2])

注:key需要用""引起來

  其中的參數axis,可設置是橫向分組還是縱向分組,默認是橫向分組(axis=0),也是比較常用的。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.read_excel('./input/class.xlsx')
>>> df
  class     sex  score_math  score_music
0     A    male          95           79
1     A  female          96           90
2     B  female          85           85
3     C    male          93           92
4     B  female          84           90
5     B    male          88           70
6     C    male          59           89
7     A    male          88           86
8     B    male          89           74

#使用groupby()按照class進行分組,返回的結果是一個GroupBY對象,即拆分過程
>>> df.groupby('class')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D18D73DA0>

  分組時所依據的鍵的唯一值作為索引,且當傳入多個值時將產生層次化索引 

>>> df.groupby('class').sum()
       score_math  score_music
class
A             279          255
B             346          319
C             152          181

>>> df.groupby(['class','sex']).mean()
              score_math  score_music
class sex
A     female        96.0         90.0
      male          91.5         82.5
B     female        84.5         87.5
      male          88.5         72.0
C     male          76.0         90.5

  在分組時除了傳入列表,也可傳入一個對於對象行或列長度一致的數組。(並不常用)

例:求按性別分組的各課程平均分,傳入性別使用中文表示的一個數組

>>> arr = np.array(['男','女','女','男','女','男','男','男','男'])
>>> df.groupby(arr).mean()
   score_math  score_music
女   88.333333    88.333333
男   85.333333    81.666667

  .count()函數可統計各組樣本數量,.idxmax()函數可返回最大值的索引

 

#按照class和sex分組后各組樣本的數量
>>> df.groupby(['class','sex']).count()
              score_math  score_music
class sex
A     female           1            1
      male             2            2
B     female           2            2
      male             2            2
C     male             2            2

##按照class和sex分組后最大值的索引
>>> df.groupby(['class','sex']).idxmax()
              score_math  score_music
class sex
A     female           1            1
      male             0            7
B     female           2            4
      male             8            8
C     male             3            3

>>> df.groupby(['class','sex']).count().idxmax()
score_math     (A, male)
score_music    (A, male)
dtype: object

#按照class和sex分組后樣本數量最多的索引
>>> df.groupby(['class','sex']).count().idxmax()[0]
('A', 'male')

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM