Python Pandas 数据分组 pd.groupby 的相关操作(一)

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