分组后的数据转换,是指用数据框(DataFrame)的 groupby() 完成分组之后,再通过数据转换来修改或生成新的数据。本节的实现方法是 transform() 函数。参数为操作名字符串。功能是:将操作应用到每一个分组,转换后返回一个序列(Series)。与上一节 agg 把每个组压成一行汇总不同,transform() 会把每个分组转换后的结果应用回原始数据框的相应位置,因此返回序列的长度和行标签都与原数据框一致。
课程沿用销售业绩数据框(列:姓名、分区、一季度~四季度;8 人分属天河、黄埔、越秀)。先执行 group = df.groupby('分区'),再从分组对象中取出列后转换:group['四季度'].transform('mean'),用于计算各区四季度的平均值。输出是长度为 8、名为「四季度」的序列:行标签 0~7 依次约为 2890.666667、3143.666667、2836.500000、3143.666667、2890.666667、2890.666667、3143.666667、2836.500000。同一分区的人得到同一个组均值:标签 0、4、5(赵四、周金、吴达)对应天河四季度均值 2890.666667,由原始值 2672、4066、1934 平均得到;标签 1、3、6(钱多、李萌、郑华)对应黄埔 3143.666667;标签 2、7(孙冰、王军)对应越秀 2836.5。
易错点:必须先 groupby 得到分组对象,再按列调用 transform,课程写法是 group['四季度'].transform('mean'),参数是操作名字符串。transform 返回序列,不要与 agg(每组一行、以分区为行索引)混淆。转换结果不会自动改写原数据框,需要赋值才能作为新列保存。同一组内各行的转换值相同,行标签保持为原始位置(本例仍为 0~7),不会按组重建。
transform() 函数。'mean'。group['四季度'].transform('mean') 计算各区四季度平均值。agg 混淆:agg 每组一行,transform 对齐回原始各行。