1. 分组

  1. 分组运算的过程为:拆分-应用-合并

    • 拆分阶段:Series/DataFrame等数据根据你提供的一个或者多个键,被拆分为多组
    • 应用阶段:根据你提供的一个函数应用到这些分组上
    • 合并阶段:将函数的执行结果合并到最终结果中
  2. 分组中有两种数据:源数据(被分组的对象),分组数据(用于划分源数据的)。

    • 源数据每一行(axis=0) 对应于分组数据中的一个元素。分组数据中每一个唯一值对应于一个分组。
    • 当分组数据也在源数据中时,可以直接通过指定列名来指定分组数据(值相同的为同一组)。
  3. .groupby()方法是分组方法:

    1. Series/DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True,
    2. group_keys=True, squeeze=False, **kwargs)
    • by:一个mapping functionlist of function、一个字典、一个序列、一个元组、一个list of column name。它指定了分组数据。

      • 如果传入了函数,则在每个index value上调用函数来产生分组数据

      • 如果是Series或者字典,则根据每个index value在字典/Series中的值来产生分组数据

      • 如果是个column label,则使用该label抽取出来的一列数据产生分组数据

      • 如果是个column labellist,则使用一组column label抽取出来的多列数据作为分组数据。

      • 如果是个序列,则它直接指定了分组数据。

      • 如果是个序列的序列,则使用这些序列拼接成一个MulitiIndex,然后根据这个MultiIndex替换掉index后,根据label value来分组。(事实上并没有替换,只是用于说明这个过程)

        如果axis=1,则index label替换成column label

    • axis:指定沿着哪个轴分组。可以为0/'index',表示沿着 0轴。可以为1/'columns',表示沿着 1轴

    • level:一个整数、level name或者其序列。如果axis是个MultiIndex,则在指定级别上的索引来分组

    • as_index:一个布尔值。如果为True,则将group label作为输出的index。如果为False,则输出是SQL风格的分组(此时分组的key作为一列,而不是作为index)。Series中,该参数必须为True

    • sort:一个布尔值。如果为True,则对分组的键进行排序。

    • group_keys:一个布尔值。如果为True,且调用了函数来决定分组,则添加分组键来区分不同的数据(否则你不知道每一行数据都对应于哪里)

    • squeeze:一个布尔值。如果为True,则尽可能的缩减结果的类型。

    该函数返回一个GroupBy对象。

    groupby0 groupby1 groupby2

  4. 我们可以使用dtype来分组,此时by=df.dtypes,axis=1groupby_dtype

  5. 对于由DataFrame产生的GroupBy对象,我们可以用一个或者一组列名对其索引。它其实一个语法糖。

    • 如果索引是一个列名,则df.groupby('key1')['data1'] 等价于df['data1'].groupby(df['key1'])

    • 如果索引是一个元组和序列,则 df.groupby('key1')[['data1','data2']] 并不等价于 df[['data1','data2']].groupby(df['key1']),而是等同于 df.groupby(df['key1'])

      • 之所以用 [['data1','data2']],是因为df[['data1','data2']]df['data1','data2']语义不同。后者表示某个label是个元组,该元组的值为'data1','data2'

groupby_sugar