Python Pandas 數據分組 pd.groupby 的相關操作(一)

數據準備

import pandas as pd
# 假設有 5 個人,分別參加了 4 門課程,獲得了對應的分數
# 同時這個 5 個人分別負責的項目個數 在 'Project_num' 列中顯示
data = {'Math_A' : [1.1, 2.2, 3.3, 4.4, 1.1, 3.2, 2.4, 1.5, 4.3, 4.5],
        'English_A' : [3, 2.6, 2, 1.7, 3, 3.3, 4.4, 5, 3.2, 2.4],
        'Math_B' : [1.7, 2.5, 3.6, 2.4, 1.7, 2.2, 3.3, 4.4, 1.5, 4.3],
        'English_B' : [5, 2.6, 2.4, 1.3, 5, 3.6, 2.4, 5, 2.2, 3.1],
        'Project_num' : [2, 3, 0, 1, 2, 2, 1, 0, 3, 4],
        'Sex' : ['F', 'M', 'M', 'F', 'F', 'F', 'M', 'M', 'F', 'M']
     }
# 在額外設定 index 的時候,這裏不要用 pd.Series,直接用 列表,否則會出問題

index = pd.MultiIndex.from_tuples([('Group_1','Alice'),('Group_1','Bob'),('Group_1','Cathy'),('Group_1','Dany'),
                                   ('Group_2', 'Alice'),('Group_2', 'Ford'),('Group_2', 'Gary'),
                                   ('Group_2', 'Ham'),('Group_2', 'Ico'),('Group_2', 'Jack')],
                                  names=['Group','Name'])

df = pd.DataFrame(data,index)
print(df)

運行結果:

               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Alice     1.1        3.0     1.7        5.0            2   F
        Bob       2.2        2.6     2.5        2.6            3   M
        Cathy     3.3        2.0     3.6        2.4            0   M
        Dany      4.4        1.7     2.4        1.3            1   F
Group_2 Alice     1.1        3.0     1.7        5.0            2   F
        Ford      3.2        3.3     2.2        3.6            2   F
        Gary      2.4        4.4     3.3        2.4            1   M
        Ham       1.5        5.0     4.4        5.0            0   M
        Ico       4.3        3.2     1.5        2.2            3   F
        Jack      4.5        2.4     4.3        3.1            4   M

一、分組並統計各組數量 df.groupby().size()

1.1 按列內元素進行分組 df.groupby(by=‘label’)

print(df.groupby(by='Sex').size())
# 對性別這一列進行分組統計數量

運行結果:

Sex
F    5
M    5
dtype: int64

1.2 按 index 做分組 df.groupby(level=0)

print(df.groupby(level=0).size())
# 對第一層的 index 做分組 統計數量,分別顯示兩組的數量
print(df.groupby(level=1).size())
# 對第二層的 incex 做分組 統計數量,這裏 Alice 同時隸屬於 2 個小組
# 如果只有一層 index ,那 level 只能取 0

運行結果:

Group
Group_1    4
Group_2    6
dtype: int64

Name
Alice    2
Bob      1
Cathy    1
Dany     1
Ford     1
Gary     1
Ham      1
Ico      1
Jack     1
dtype: int64

二、分組顯示(類似迭代器)

2.1 針列不同元素進行分組顯示

for index, data in df.groupby(by='Sex'):
    # 對不同性別進行分組顯示
    print(index)
    print(data)
    print('\n')

運行結果:

F
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Alice     1.1        3.0     1.7        5.0            2   F
        Dany      4.4        1.7     2.4        1.3            1   F
Group_2 Alice     1.1        3.0     1.7        5.0            2   F
        Ford      3.2        3.3     2.2        3.6            2   F
        Ico       4.3        3.2     1.5        2.2            3   F


M
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Bob       2.2        2.6     2.5        2.6            3   M
        Cathy     3.3        2.0     3.6        2.4            0   M
Group_2 Gary      2.4        4.4     3.3        2.4            1   M
        Ham       1.5        5.0     4.4        5.0            0   M
        Jack      4.5        2.4     4.3        3.1            4   M


2.2 對 index 的不同項目進行分組顯示

for index, data in df.groupby(level=0):
    # 對第一層 index 即不同的 Group 進行分組顯示
    print(index)
    print(data)
    print('\n')

運行結果:

Group_1
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Alice     1.1        3.0     1.7        5.0            2   F
        Bob       2.2        2.6     2.5        2.6            3   M
        Cathy     3.3        2.0     3.6        2.4            0   M
        Dany      4.4        1.7     2.4        1.3            1   F


Group_2
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_2 Alice     1.1        3.0     1.7        5.0            2   F
        Ford      3.2        3.3     2.2        3.6            2   F
        Gary      2.4        4.4     3.3        2.4            1   M
        Ham       1.5        5.0     4.4        5.0            0   M
        Ico       4.3        3.2     1.5        2.2            3   F
        Jack      4.5        2.4     4.3        3.1            4   M


2.3 針對多列進行疊加分組顯示

df_gb = df.groupby(['Sex', 'Project_num'])
# 對性別分組,和負責項目數量分組,進行疊加顯示
for (index_1, index_2), data in df_gb:
    print((index_1, index_2))
    print(data)
    print('\n')

運行結果:

('F', 1)
              Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                       
Group_1 Dany     4.4        1.7     2.4        1.3            1   F


('F', 2)
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Alice     1.1        3.0     1.7        5.0            2   F
Group_2 Alice     1.1        3.0     1.7        5.0            2   F
        Ford      3.2        3.3     2.2        3.6            2   F


('F', 3)
              Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                       
Group_2 Ico      4.3        3.2     1.5        2.2            3   F


('M', 0)
               Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                        
Group_1 Cathy     3.3        2.0     3.6        2.4            0   M
Group_2 Ham       1.5        5.0     4.4        5.0            0   M


('M', 1)
              Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                       
Group_2 Gary     2.4        4.4     3.3        2.4            1   M


('M', 3)
              Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                       
Group_1 Bob      2.2        2.6     2.5        2.6            3   M


('M', 4)
              Math_A  English_A  Math_B  English_B  Project_num Sex
Group   Name                                                       
Group_2 Jack     4.5        2.4     4.3        3.1            4   M


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章