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