我注意到pd.DataFrame.groupby
有几种用法后跟apply
隐式假设groupby
是stable - 也就是说,如果 a < / em>和 b 是同一组的实例,预先分组, a 出现在 b 之前,然后 a 也会在分组后出现在 b 之前。
我认为有几个答案显然隐含地使用了这个,但是,具体来说,这里是one using groupby
+cumsum
。
这种行为真的有什么前途吗?该文档仅说明:
使用mapper(dict或key函数,将给定函数应用于组,将结果作为系列返回)或一系列列的组系列。
此外,大熊猫有指数,理论上也可以在没有这种保证的情况下实现功能(尽管以更加繁琐的方式)。
答案 0 :(得分:6)
虽然文档内部没有说明,但它在生成组时使用稳定排序。
见:
正如我在评论中提到的,如果你考虑transform
将返回一个系列,其索引与原始df对齐,这一点非常重要。如果排序没有保留顺序,那么这将使对齐执行额外的工作,因为它需要在分配之前对系列进行排序。事实上,这是in the comments:
_algos.groupsort_indexer
实施计算排序,至少是这样O(ngroups)
,其中
ngroups = prod(shape)
shape = map(len, keys)
即,独特的组合(笛卡尔积)的数量是线性的 groupby键的值。当进行多键组合时,这可能是巨大的。
np.argsort(kind='mergesort')
是O(count x log(count))
,其中count是 数据帧的长度; 两种算法都是稳定排序,这对于正确性是必要的 groupby操作。e.g。考虑:
df.groupby(key)[col].transform('first')
答案 1 :(得分:1)
是的; DataFrame.groupby
的 sort
参数的描述现在承诺 groupby
(有或没有键排序)“保留每个组中的行顺序”:
sort : bool,默认 True
对组键进行排序。获得更好的性能 关闭此功能。请注意,这不会影响顺序 每组内的观察。 Groupby 保留行的顺序 每个组内。