数据的分组运算—groupby
分组运算的标准术语**“拆分—应用—合并”(split-apply-combine)**,具体如下图,
pandas对象的分组与聚合使用的是 groupby方法,
参数解读
基本使用
首先构建如下DataFrame对象,
1)Series分组
使用 key1 这一列对 data1 这一列进行分组,通过by参数将 key1 这一列传入,
这个GroupBy对象只包含了分组的中间数据,具有进一步分组进行运算的能力。
聚合得到的是一个索引为key1列唯一值,索引列名也为“key1”的对象,groupby方法同样支持根据多个不同的列进行分组,
根据多个列进行分组后得到的是层次化索引,可以看做是两列不同元素之间构成的笛卡尔积。可以使用unstack方法去除堆叠,
分组也支持使用长度与DataFrame行数等长的numpy数组、列表进行分组,
2)DataFrame的分组
依旧使用最开始构建的DataFrame,
使用一列或多列对DataFrame进行分组的方式与Series分组方式是相同的。
GroupBy对象size方法
GroupBy对象的size方法有时候是很有用的,它能返回各个分组的大小,
分组进行迭代
groupby方法产生的GroupBy对象支持迭代,产生一组二元tuple,
如果是多个列同时进行分组,则GroupBy对象的tuple的第一个元素是个tuple,
依据每列数据类型进行分组
使用dtype对列进行分组,
因为是按列进行分组,所以是在水平方向上进行拆分。故axis参数值为1。
分组后选取一个或一组列进行运算
选取一列进行运算,
上面的一行代码实际上可以分为两步进行理解,
使用字典或者Series进行分组
除了numpy数组,分组的信息还可以以其他形式存在。不同于numpy数组,字典和Series不要求一定与Dataframe或者Series等长,通过键值和索引匹配即可,
1)字典形式进行分组
创建一个用于分组的字典,字典的键值可以不与DataFrame的列名数目相等,
2)Series形式进行分组
通过函数进行分组
任何用于分组的函数都会在各个索引上执行一次,函数返回值会被用作分组的名称,
使用 len方法对DataFrame进行分组,
函数与数组、字典、列表、Series等序列混合使用,
混合使用后生成的是层次化索引。
依据索引级别进行分组
当Dataframe和Series存在层级化索引时,使用 groupby方法的 level参数可以指定使用哪一层索引进行分组,
上面的代码依据 cty 这一层列索引将DataFrame在水平方向上进行分组。