数据分组与聚合
数据包含在Series、DataFrame数据结构中,可以根据一个或多个键分离到各个组中。分组操作之后,一个函数就可以应用到各个组中,产生新的值。如下图则是简单的分组聚合过程。
df.groupby(‘key’) key为指定分组的列
import pandas as pd
import numpy as np
df1 = pd.DataFrame(
{
"names":["菲菲","小可爱","mia","牛哥","老王","mia","狼人","药水哥","药水哥"],
"classes":["一班","二班","三班"]*3,
"grades":np.random.randint(60,100,size=9)
}
)
df1
# 以班级进行分组
g = df1.groupby(by="classes") # 返回:DataFrameGroupBy的对象,可迭代的
g
# 遍历 DataFrameGroupBy 的对象
for i in g:
print(i) # 输出的结果:(组名,每个组的数据)
print("-"*50)
for g_name,group in g:
print(g_name) # 组名
print(group) # 数据块
# 查看数据类型
print(type(group)) # DataFrame
# 了解每个班级的均值 分组+聚合
df1.groupby(by="classes")["grades"].mean() # 指定数据进行聚合
df1.groupby(by="classes").mean() # 整个数据进行聚合
自定义聚合函数
实现步骤:
• 自定义函数
• 分组后通过agg或者aggregate进行聚合
练习:
• 计算每个班级之间的差值:一班的最大值-一班的最小值
# 定义求各班级极差的函数
def classes_ptp(x):
return x.max()-x.min()
df1.groupby(by="classes")["grades"].agg(classes_ptp)
# df1.groupby(by="classes")["grades"].aggregate(classes_ptp)
"""
需求:显示 各班级的极差 最大值 最小值
实现:agg,aggregate都可以传入列表
"""
agg_li = [np.ptp,np.max,np.min]
df1.groupby(by="classes")["grades"].agg(agg_li)