1. 程式人生 > 其它 >pandas:聚合統計、資料分箱、分組視覺化

pandas:聚合統計、資料分箱、分組視覺化

1、聚合統計

1.1描述統計

  #df.describe(),對資料的總體特徵進行描述
  df.groupby('team').describe()
  df.groupby('team').describe().T #列數太多,進行轉置

1.2統計函式

  #對分組物件直接使用統計函式,分組內資料進行計算,返回df形式的資料

  #計算平均數
  df.groupby('team').mean()
  #相關性係數

  df.groupby('team').corr()
  #每組的累計最大值

  df.groupby('team').cummax()

1.3聚合方法agg()

將分組後的物件給定統計方法,支援按欄位分別給定不同的統計方法

  #所有列使用一個計算方法
  df.groupby('team').agg(sum)
  df.groupby('team').agg(np.size)
  #一個欄位使用多種統計方法,不同欄位使用不同表達
  grouped = df.groupby("team")
  grouped[['Q1','Q2']].agg([np.sum,np.mean,np.std])
  #不同列使用不同計算方法,且一個列用多個計算方法
  df.groupby("team").agg({'Q1':['min','max'],'Q2':['sum']})
  #agg()可以指定新列的名字,新列的名字為Mean,Sum
  grouped.Q1.agg(Mean='mean',Sum='sum')
  #Mean為Q1計算平均值,Sum為Q2計算和。
  grouped.agg(Mean=('Q1','mean'),Sum=('Q2','sum')) 
  #如果列名不是有效的Python變數格式 比如列名是‘1_max’
  grouped.agg(**{'1_max':pd.NamedAgg(column='Q1',aggfunc='max')})
  #使用函式,分別傳入每個分組的子df,按子df把這組所有的列組成的序列傳到函式裡進行計算,返回固定值
  #lambda函式,所有方法都可以使用
  def max_min(x):
      return x.max()-x.min()

  df.groupby('team').Q1.agg(Mean='mean',
                            Sum='sum',
                            Diff=lambda x: x.max()-x.min(),
                            Max_min=max_min)

1.4時序重取樣resample()

針對時間序列資料,resample()將分組後的時間索引按週期進行聚合統計

  #建立一組資料:

  idx = pd.date_range('5/21/2022',periods=100,freq='T')
  df2 = pd.DataFrame(data={'a':[0,1]*50,'b':1},index=idx)
  df2
  #索引為一個時序資料,按a列進行分組,按每20min對b進行求和
  df2.groupby('a').resample('20T').sum()
  df2.groupby('a').sum()
  #以右邊時間點為標識
  df2.groupby('a').resample('3T',closed='right').sum()
  #按月份為週期取樣
  df2.groupby('a').resample('M').sum()

1.5組內頭尾值

  #所有組的第一個值
  df.groupby('team').first()
  #最後一個值
  grouped.last()

1.6組內分位數

  #二分位數
  grouped.quantile(0.5)
  grouped.median()

1.7組內差值

  grouped[['Q1','Q2','Q3','Q4']].diff().head(10)

2、資料分箱

資料分箱將原始資料分成幾個小區間,即bin(小箱子)

落入給定區間的原始資料值 被 代表該區間的值 替換
可以有助於減少過擬合,平滑輸入資料
pd.cut :指定分界點 pd.qcut :指定區間數量,等寬分箱處理

2.1定界分箱

  #pd.cut指定區間,將數字進行劃分
  #將Q1成績按0,60,100

  pd.cut(df.Q1,bins=[0,60,100])

  '''
  ```
  0     (60, 100]
  1       (0, 60]
  2       (0, 60]
  3     (60, 100]
  4     (60, 100]
          ...    
  95      (0, 60]
  96      (0, 60]
  97    (60, 100]
  98      (0, 60]
  99      (0, 60]
  Name: Q1, Length: 100, dtype: category
  Categories (2, interval[int64]): [(0, 60] < (60, 100]]
  ```
  '''


  #將分箱結果應用到groupby分組

  df.Q1.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()

  '''
  ```
  Q1
  (0, 60]      57
  (60, 100]    43
  Name: Q1, dtype: int64
  ```
  '''

  # DateFrame使用

  df.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()
  # 顯示了每個分組的資料
  pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格'])

  pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格']).count()

  '''
  ```
  0      及格
  1     不及格
  2     不及格
  3      及格
  4      及格
       ... 
  95    不及格
  96    不及格
  97     及格
  98    不及格
  99    不及格
  Name: Q1, Length: 100, dtype: category
  Categories (2, object): ['不及格' < '及格']
  ```
  '''

2.2等寬分箱

  #按Q1成績分為兩組
  pd.qcut(df.Q1,q=2)

  '''
  ```
  0      (51.5, 98.0]
  1     (0.999, 51.5]
  2      (51.5, 98.0]
  3      (51.5, 98.0]
  4      (51.5, 98.0]
            ...      
  95    (0.999, 51.5]
  96    (0.999, 51.5]
  97     (51.5, 98.0]
  98    (0.999, 51.5]
  99    (0.999, 51.5]
  Name: Q1, Length: 100, dtype: category
  Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
  ```
  '''

  #檢視分組區間
  pd.qcut(df.Q1,q=2).unique()

  '''
  ```
  [(51.5, 98.0], (0.999, 51.5]]
  Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
  ```
  '''

  #應用到分組中:

  #series使用
  df.Q1.groupby(pd.qcut(df.Q1,q=2)).count()

  '''
  ```
  Q1
  (0.999, 51.5]    50
  (51.5, 98.0]     50
  Name: Q1, dtype: int64
  ```
  '''

  #DateFrame使用
  df.groupby(pd.qcut(df.Q1,q=2)).count()
  #指定標籤名
  pd.qcut(range(5),3,labels=['good','medium','bad'])

  '''
  ```
  ['good', 'good', 'medium', 'bad', 'bad']
  Categories (3, object): ['good' < 'medium' < 'bad']
  ```
  '''

  #返回箱子標籤
  pd.qcut(df.Q1,q=2,retbins=True)

3、分組視覺化

3.1繪圖方法

  #分組,設定索引為name

  grouped = df.set_index('name').groupby('team')
  grouped.plot()

3.2直方圖hist()

  #繪製直方圖
  grouped.hist()

3.3箱線圖boxplot()

分組箱線圖

grouped.boxplot(figsize=(15,12))

分組箱線圖,按team分組並返回箱線圖

df.boxplot(by='team',figsize=(15,10))