【问题标题】:Is pandas.DataFrame.groupby Guaranteed To Be Stable?pandas.DataFrame.groupby 保证稳定吗?
【发布时间】:2017-01-15 09:01:30
【问题描述】:

我注意到pd.DataFrame.groupby 有多种用法,后跟apply 隐含假设groupbystable - 也就是说,如果 ab 是同组的实例,并且预先分组,a出现在b之前,那么a会出现在之前b 也跟着分组。

我认为有几个答案显然隐含地使用这个,但是,具体来说,这里是one using groupby+cumsum

有什么真正有希望实现这种行为的吗?文档仅说明:

使用映射器(dict 或 key 函数,将给定函数应用于组,将结果作为系列返回)或按一系列列对系列进行分组。

此外,pandas 具有索引,理论上也可以在没有此保证的情况下实现功能(尽管以更麻烦的方式)。

【问题讨论】:

  • 对不起,你问的是 2 行说 ab 是否具有相同的值,分组后是否保证它们的顺序相同?我敢肯定,我在单步执行代码时已经看到他们执行稳定排序,我必须再次找到它
  • @EdChum 是的,如果我理解正确的话。如果行 ab 就分组标准而言是等效的(它们将最终在同一组中),它们是否保证保留他们的订单发布分组。我一直在实践中看到它,但有点担心文档似乎无法保证这一点。
  • 我一直看到这种行为,从未见过任何其他类型的行为,文档没有指定或保证这不会打扰我的事实,但我在逐步浏览编写大量 cmets 和对稳定排序的引用,这对我来说是合乎逻辑的,因为如果分组决定更改原始顺序,则另一种方法是让像 transform 这样的函数很难合并回原始 df 索引
  • @EdChum 非常感谢。
  • 如果只要保留原始索引就没有保留顺序,那么它仍然会正确对齐,但如果返回的系列没有增加顺序,那么对齐就会很痛苦需要在分配回原点 df 之前进行排序

标签: python pandas group-by language-lawyer


【解决方案1】:

是的; DataFrame.groupbysort 参数的描述现在承诺 groupby(有或没有键排序)“保留每个组内的行顺序”:

排序bool,默认为True

对组键进行排序。通过以下方式获得更好的性能 关闭它。注意这不影响顺序 每个组内的观察。 Groupby 保留行的顺序 在每个组内。

【讨论】:

  • 谢谢。我认为当我问的时候文档不是这样的,但这确实解决了它。
  • 是的;我相信你是对的;这就是为什么我说“现在承诺”:)
【解决方案2】:

虽然文档没有在内部说明这一点,但它在生成组时使用了稳定排序。

见:

正如我在 cmets 中提到的,如果您考虑 transform,这很重要,它将返回一个其索引与原始 df 对齐的 Series。如果排序没有保留顺序,那么这将使对齐执行额外的工作,因为它需要在分配之前对系列进行排序。其实这是提到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 是 数据帧的长度; 两种算法都是稳定排序的,这对于正确性是必要的 分组操作。

例如考虑: df.groupby(key)[col].transform('first')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多