如何在熊猫的 groupby 对象中获取组数?

Posted

技术标签:

【中文标题】如何在熊猫的 groupby 对象中获取组数?【英文标题】:How to get number of groups in a groupby object in pandas? 【发布时间】:2015-03-03 11:40:51 【问题描述】:

这很有用,因此我知道我必须对多少个唯一组执行计算。谢谢。

假设 groupby 对象被称为dfgroup

【问题讨论】:

【参考方案1】:

[pandas >= 0.23] 简单、快速和 Pandaic:ngroups

较新版本的 groupby API 提供了这个(未记录的)属性,该属性将组数存储在 GroupBy 对象中。

# setup
df = pd.DataFrame('A': list('aabbcccd'))
dfg = df.groupby('A')

# call `.ngroups` on the GroupBy object
dfg.ngroups
# 4

请注意,这与返回实际组本身的GroupBy.groups 不同。

为什么我更喜欢这个而不是len

如BrenBarn's answer 中所述,您可以使用len(dfg) 获取组数。 但你不应该。查看implementation of GroupBy.__len__(这是len() 内部调用的),我们看到__len__ 调用GroupBy.groups,它返回一个分组索引的字典:

dfg.groups
'a': Int64Index([0, 1], dtype='int64'),
 'b': Int64Index([2, 3], dtype='int64'),
 'c': Int64Index([4, 5, 6], dtype='int64'),
 'd': Int64Index([7], dtype='int64')

根据您操作中的组数,生成字典只是为了找到它的长度是一个浪费的步骤。另一方面,ngroups 是一个存储属性,可以在恒定时间内访问

这已记录在GroupBy object attributes 中。然而,len 的问题在于,对于具有很多组的 GroupBy 对象,这可能需要更长的时间

但是如果我真的想要每个组的大小呢?

你很幸运。我们有一个函数,它叫做GroupBy.size。但请注意,size 也计算 NaN。如果您不想计算 NaN,请改用 GroupBy.count

【讨论】:

@U9-转发谢谢!这不是一个受欢迎的问题(相对而言),但我认为这里的支持意味着答案很有用。我仍然觉得我可以做出改进,所以我会稍微研究一下。 我猜你应该得到更多,ngroups 很聪明 :-) 注意len(g)如果有大量组,第一次调用时可能会非常慢!!此后 IPython 会缓存结果,但 g.ngroups 总是很快,因为它是作为属性存储的。【参考方案2】:

作为documented,你可以得到len(dfgroup)的组数。

【讨论】:

如下所述,使用len(dfgroup) 可能会非常慢,尤其是对于大量组。 dfgroup.ngroups 是获取此值的最快方法,因为这是一个存储值!

以上是关于如何在熊猫的 groupby 对象中获取组数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫 groupby 之后获取列表列表

获取熊猫 groupby 对象中多列的最大聚合

如何在复杂的熊猫 groupby 中绘制图形?

如何在熊猫中按对象分组应用滚动功能

如何在图表中绘制熊猫 groupby 值

如何在熊猫中过滤 groupby 的结果