1. 程式人生 > 實用技巧 >15-pandas之陣列分組的基本方法(分組大小與排序、迭代、指定組或列)

15-pandas之陣列分組的基本方法(分組大小與排序、迭代、指定組或列)

若()資料分組的基本方法有3種:

  1. 分組大小和分組排序
  2. 對分組進行迭代
  3. 選擇指定組或指定的列

一、分組大小和分組排序

  可通過GroupBy物件的size()方法,知道每個分組的樣本數;

>>> df.groupby(['class']).size()
class
A    3
B    4
C    2
dtype: int64

>>> df.groupby(['class','sex']).size()
class  sex
A      female    1
       male      2
B      female    2
       male      2
C      male      2
dtype: int64

  預設情況下,分組聚合後的索引會進行排序,可能會降低執行速度,所以,在資料量很大的時候可以設定sort = False,指定不進行排序以提高分組速度

>>> df.groupby('class',sort = False).mean()
       score_math  score_music
class
A            93.0        85.00
B            86.5        79.75
C            76.0        90.50

二、對分組進行迭代

  GroupBy物件是一個可迭代物件,所以可以通過迭代獲取分組名和資料;

例如:獲取班級的分組名和資料(若按多個鍵進行分組,則分組名變成元祖

>>> grouped = df.groupby('class')
>>> for name,group in grouped:
...     print(name)
...     print(group)
...     print('-'*40)

A
  class     sex  score_math  score_music
0     A    male          95           79
1     A  female          96           90
7     A    male          88           86
----------------------------------------
B
  class     sex  score_math  score_music
2     B  female          85           85
4     B  female          84           90
5     B    male          88           70
8     B    male          89           74
----------------------------------------
C
  class   sex  score_math  score_music
3     C  male          93           92
6     C  male          59           89
----------------------------------------

三、選擇指定組或指定的列

  (1)將分組名及其資料封裝成一個字典,便於後序選擇指定組的資料;

  值得注意的是:不可直接將GroupBy物件打包成字典,必須先將其轉化成包含多個元組的列表,才能使用dict()將其轉換成字典。

>>> grouped = df.groupby('class')
>>> pieces = dict(list(grouped))

>>> len(pieces)
3

>>> pieces.keys()
dict_keys(['A', 'B', 'C'])

>>> pieces['A']
  class     sex  score_math  score_music
0     A    male          95           79
1     A  female          96           90
7     A    male          88           86

  (2)GroupBy物件的get_group()也可以達到同樣的效果而且更直觀

>>> grouped.get_group('A')
  class     sex  score_math  score_music
0     A    male          95           79
1     A  female          96           90
7     A    male          88           86

  (3)若只需要對指定的列進行GroupBy操作,只需在groupby()後加上指定的列即可

>>> df.groupby('class')['score_math'].mean()
class
A    93.0
B    86.5
C    76.0

>>> df.groupby('class')['score_math','score_music'].mean()
       score_math  score_music
class
A            93.0        85.00
B            86.5        79.75
C            76.0        90.50