2. GroupBy对象

  1. GroupBy对象是一个迭代器对象。迭代结果产生一组二元元组(由分组名和数据块组成)。

    • 如果有多重键,则元组的第一个元素将是由键组成的元组。
    • dict(list(GroupBy_obj))将生产一个字典,方便引用

    GroupBy_iter1 GroupBy_iter2

    • GroupBy.groups属性返回一个字典: {group name->group labels}
    • GroupBy.indices属性返回一个字典:{group name->group indices}

    GroupBy_groups_indices

  2. GroupBy的统计函数有(排除了NaN):

    • GroupBy.count() :计算各分组的非NaN的数量
    • GroupBy.cumcount([ascending]):计算累积分组数量
    • GroupBy.first():计算每个分组的第一个非NaN
    • GroupBy.head([n]) :返回每个分组的前 n个值
    • GroupBy.last() :计算每个分组的最后一个非NaN
    • GroupBy.max():计算每个分组的最大值
    • GroupBy.mean(*args, **kwargs):计算每个分组的均值
    • GroupBy.median():计算每个分组的中位数
    • GroupBy.min():计算每个分组的最小值
    • GroupBy.nth(n[, dropna]):计算每个分组第n行数据。 如果n是个整数列表,则也返回一个列表。
    • GroupBy.ohlc():计算每个分组的开始、最高、最低、结束值
    • GroupBy.prod():计算每个分组的乘
    • GroupBy.size():计算每个分组的大小(包含了NaN
    • GroupBy.sem([ddof]) :计算每个分组的sem(与均值的绝对误差之和)
    • GroupBy.std([ddof]) :计算每个分组的标准差
    • GroupBy.sum():计算每个分组的和
    • GroupBy.var([ddof]):计算每个分组的方差
    • GroupBy.tail([n]) :返回每个分组的尾部 n个值

    另外SeriesGroupBy/DataFrameGroupBy也支持Series/DataFrame的统计类方法以及其他方法:

    1. #SeriesGroupBy - DataFrameGroupBy 都有的方法:
    2. .agg(arg, *args, **kwargs)
    3. .all([axis, bool_only, ...])
    4. .any([axis, bool_only, ...])
    5. .bfill([limit])
    6. .corr([method, min_periods])
    7. .count()
    8. .cov([min_periods])
    9. .cummax([axis, skipna])
    10. .cummin([axis, skipna])
    11. .cumprod([axis])
    12. .cumsum([axis])
    13. .describe([percentiles, ...])
    14. .diff([periods, axis])
    15. .ffill([limit])
    16. .fillna([value, method, ...])
    17. .hist(data[, column, by, ...])
    18. .idxmax([axis, skipna])
    19. .idxmin([axis, skipna])
    20. .mad([axis, skipna, level])
    21. .pct_change([periods, ...])
    22. .plot
    23. .quantile([q, axis, ...])
    24. .rank([axis, method, ...])
    25. .resample(rule, *args, **kwargs)
    26. .shift([periods, freq, axis])
    27. .size()
    28. .skew([axis, skipna, level, ...])
    29. .take(indices[, axis, ...])
    30. .tshift([periods, freq, axis])
    31. #SeriesGroupBy独有的方法
    32. SeriesGroupBy.nlargest(*args, **kwargs)
    33. SeriesGroupBy.nsmallest(*args, **kwargs)
    34. SeriesGroupBy.nunique([dropna])
    35. SeriesGroupBy.unique()
    36. SeriesGroupBy.value_counts([normalize, ...])
    37. #DataFrameGroupBy独有的方法
    38. DataFrameGroupBy.corrwith(other[, axis, drop])
    39. DataFrameGroupBy.boxplot(grouped[, ...])

    GroupBy_method0 GroupBy_method1

  3. 如果你希望使用自己的聚合函数,只需要将其传入.aggregate(func, *args, **kwargs)或者.agg()方法即可。其中func接受一维数组,返回一个标量值。

    • 注意:自定义聚合函数会慢得多。这是因为在构造中间分组数据块时存在非常大的开销(函数调用、数据重排等)
    • 你可以将前面介绍的GroupBy的统计函数名以字符串的形式传入。
    • 如果你传入了一组函数或者函数名,则得到的结果中,相应的列就用对应的函数名命名。如果你希望提供一个自己的名字,则使用(name,function)元组的序列。其中name用作结果列的列名。
    • 如果你希望对不同的列采用不同的聚合函数,则向agg()传入一个字典。字典的键就是列名,值就是你希望对该列采用的函数。

    GroupBy_agg0 GroupBy_agg1

  4. .get_group(key)可以获取分组键对应的数据。

    • key :不同的分组就是依靠它来区分的
  5. GroupBy的下标操作将获得一个只包含源数据中指定列的新GroupBy对象

  6. GroupBy类定义了__getattr__()方法,当获取GroupBy中未定义的属性时:

    • 如果属性名是源数据对象的某列的名称则,相当于GroupBy[name],即获取针对该列的GroupBy对象
    • 如果属性名是源数据对象的方法,则相当于通过.apply(name)对每个分组调用该方法。