Pandas分类总结之:分组

1. 分组模式及其对象

1.1 分组的一般模式

    单一维度分组 df.groupby(Gender)[Height].mean() 多维度分组 df.groupby([School, Gender])[Height].mean() 复杂逻辑分组 df.groupby(df.Weight > df.Weight.mean())[Height].mean()

1.2 Groupby对象

gb = df.groupby([School, Grade])

    gb.ngroups,分组个数 gb.groups,返回从组名组名映射到组索引列表组索引列表的字典 gb.size(),统计每个组的元素个数 gb.get_group((values1,values2)),获取所在组对应的行

1.3 分组的三大操作

分组的三大操作:聚合、变换和过滤(agg、transform和filter)

    依据性别性别分组,统计全国人口寿命寿命的平均值平均值,每一个组返回一个标量值 依据季节季节分组,对每一个季节的温度温度进行组内标准化组内标准化,每组返回的是一个Series类型 依据班级班级筛选出组内数学分数数学分数的平均值超过80分的班级,返回的整个组所在行的本身,即返回了DataFrame类型

2.聚合函数

2.1 内置聚合函数

    内置聚合函数max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod

2.2 agg方法

gb = df.groupby(Grade)[[Height, Weight]]

    gb.agg([sum, idxmax, skew]),同时使用多个聚合函数;用列表的形式把内置聚合函数对应的字符串传入 gb.agg({Height:[mean,max], Weight:count}),对特定的列使用特定的聚合函数;以列名为键,以聚合字符串或字符串列表为值 使用自定义的聚合函数 gb.agg(lambda x: x.mean()-x.min()),需要注意传入函数的参数是之前数据源中的列,逐列进行计算 gb.agg(my_func) 对聚合结果的列名进行自定义命名 gb.agg([(range, lambda x: x.max()-x.min()), (my_sum, sum)]),函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数 gb.agg({Height: [(my_func, my_func), sum], Weight: [(range, lambda x:x.max())]}),对一个或者多个列使用单个聚合的时候,重命名需要加方括号,例如“Weight”

3.变换与过滤

3.1 变换函数与transform方法

    内置变换函数是累计函数:cumcount/cumsum/cumprod/cummax/cummin,变换函数的返回值为同长度的序列,完成的是组内累计操作 gb.transform(lambda x: (x-x.mean())/x.std()),用自定义变换时需要使用transform方法,被调用的自定义函数,其传入值为数据源的序列,其最后的返回结果是行列索引与数据源一致的DataFrame

3.2 组索引与过滤

过滤在分组中是对于组的过滤,而索引是对于行的过滤

    gb.filter(lambda x: x.shape[0] > 100),组的筛选,其中自定义函数的输入参数为数据源构成的DataFrame本身

4.跨列分组

4.1 apply函数

解决多列数据同时处理的计算

    返回标量 def BMI(x): Height = x[Height]/100 Weight = x[Weight] BMI_value = Weight/Height**2 return BMI_value.mean() gb.apply(BMI) 返回一维Series 标量情况:结果得到的是 Series ,索引与 agg 的结果一致 gb = df.groupby([Gender,Test_Number])[[Height,Weight]] gb.apply(**lambda** x: 0) 返回二维DataFrame Series情况:得到的是DataFrame,行索引与标量情况一致,列索引为Series的索引 gb.apply(lambda x: pd.Series([0,0],index=[a,b])) DataFrame情况:得到的是DataFrame,行索引最内层在每个组原先agg的结果索引上,再加一层返回的DataFrame行索引,同时分组结果DataFrame的列索引和返回的DataFrame列索引一致 gb.apply(lambda x: pd.DataFrame(np.ones((2,2)), index = [a,b], columns=pd.Index([(w,x),(y,z)])))
经验分享 程序员 微信小程序 职场和发展