为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]

Posted

技术标签:

【中文标题】为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]【英文标题】:Why do the groupby groupings change when you convert groupby to a list? [duplicate]为什么将 groupby 转换为列表时 groupby 分组会发生变化? [复制] 【发布时间】:2018-02-22 23:53:19 【问题描述】:

如果您取消注释下面的注释行,则输出将更改(对于除最后一个键之外的所有键,grouper 对象将为空)。这是为什么呢?

from itertools import groupby

c = groupby(['goat', 'dog', 'cow', 1, 1, 2, 3, 11, 10, ('persons', 'man', 'woman')])
#c = list(c)
dic = 
for k, v in c:
    dic[k] = list(v)
print dic

【问题讨论】:

不错的答案:***.com/questions/48475888/… @Javier 这是个问题。 我不知道如何参考答案。我的意思是那个问题中公认的答案。 @Javier Baw... 我希望你的意思是 my 在那里回答。在每个答案下,您都可以点击“分享”以获取该答案的链接。 谢谢!实际上,我做到了:***.com/a/48476719/3339058 【参考方案1】:

总结:原因是itertools一般不存储数据。他们只是消耗一个迭代器。所以当外层迭代器前进时,内层迭代器也必须前进。

类比:假设您是一名空姐,站在门口,让单线乘客登上飞机。乘客按登机组安排,但您一次只能看到和接纳一名。定期地,当人们进入时,您会知道一个寄宿组何时结束,然后下一个开始。

要进入下一组,您必须接纳当前组中的所有剩余乘客。如果不让所有当前的乘客通过,您就无法看到下游排队的情况。

Unix 比较:groupby() 的设计在算法上类似于 Unix uniq 实用程序。

文档说的是:“返回的组本身就是一个迭代器,它与 groupby() 共享底层迭代器。由于源是共享的,当 groupby() 对象被推进时,前一个组不再可见。”

如何使用:如果以后需要数据,应该以列表的形式存储:

groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

【讨论】:

以上是关于为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Intellij Idea 建议在使用循环将数组转换为 Set 时创建中间列表?

pandas groupby 并转换为 json 列表

熊猫 groupby 没有将按列分组转换为索引

为啥我不能将 str 列表转换为浮点列表?

为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?

编写 SQL 查询将表从 A 转换为 B