????????Pandas 的 Groupby 分组操作和 SQL 中的 Group by 功能类似,在对数据进行划分组之后可以进行聚合、转换、过滤等操作,接下来构造一个 DataFrame 举例:
data=pd.DataFrame(
{'id':[x for x in range(1,11)],
'company':[company[i] for i in np.random.randint(0,len(company),10)],
'salary':np.random.randint(5,50,10),
'age':np.random.randint(18,50,10)}
)
print(data)
????????得到一个如下Dataframe(每次随机生成的结果会不同,下文数据可能不一样)?
print(data)
id company salary age
0 1 c 18 34
1 2 c 6 34
2 3 b 15 33
3 4 b 28 44
4 5 a 8 41
5 6 b 38 42
6 7 c 22 26
7 8 b 35 42
8 9 c 13 39
9 10 a 41 49
? ? ? ? 这是对于上面代码的解释说明:帮助一下理解
company=['a','b','c'] # 三家公司
np.random.randint(0,len(company),10) # 随机生成下标
a=[]
for x in np.random.randint(0,len(company),10): # 通过下标取 company 中的数据
a.append(company[x])
print(a)
['c', 'c', 'c', 'c', 'c', 'b', 'b', 'c', 'a', 'b']
????????可以使用 data.groupby('column_name'),如上述的 data 要按 company 的字段分组
group_1=data.groupby('company')
print(group_1)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D0E36D3D0>
? ? ? ? 因此这里得到的是一个分组后对象及其内存地址,分组之后会对其进行进一步操作,使用 list 对其进行查看,如下结果可以看出 data 已经成功被分组(结构是一个列表,里面几个元组,每个元组是对应组别和DataFrame)
print(list(group_1))
[('a',
id company salary age
1 2 a 23 18),
('b',
id company salary age
0 1 b 14 48
5 6 b 27 42
7 8 b 46 20
9 10 b 49 37),
('c',
id company salary age
2 3 c 29 37
3 4 c 10 31
4 5 c 23 18
6 7 c 7 46
8 9 c 16 36)]
? ? ? ? 操作如计算最值、均值等等一系列统计量,如求平均:加上 agg('xx') 聚合即可
m=data.groupby('company').agg('mean')
print(m)
id salary age
company
a 5.666667 20.166667 33.333333
b 2.000000 18.000000 45.000000
c 6.333333 27.000000 28.666667
# 平均值
? ? ? ? 也可对多列计算不同指标
m=data.groupby('company').agg({'salary':'mean','age':'min'})
print(m)
salary age
company
a 25.000000 18
b 9.000000 26
c 36.666667 34
# 最小年龄及平均薪资