目录
一、构造数据集
Pandas 的 Groupby 分组操作和 SQL 中的 Group by 功能类似,在对数据进行划分组之后可以进行聚合、转换、过滤等操作,接下来构造一个 DataFrame 举例:
company=['a','b','c']
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 44 48
1 2 b 20 33
2 3 a 46 33
3 4 b 21 23
4 5 a 30 18
5 6 c 12 18
6 7 c 35 22
7 8 c 28 30
8 9 a 7 48
9 10 c 13 18
这是对于上面代码的解释说明:帮助一下理解
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').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
# 最小年龄及平均薪资
可以先选择需要的列,再进行分组聚合
将结果其转换为字典类型:
print(m.to_dict())
{'salary': {'a': 35.25, 'b': 16.6, 'c': 16.0}, 'age': {'a': 19, 'b': 35, 'c': 34}}
四、补充
SQL 开窗函数聚合的效果在 Python 中可用 transform() 或 apply() 函数实现