如何在pandas中查找多索引groupby对象中的组数?

时间:2016-02-06 18:15:14

标签: python pandas

我的问题很简单,但在我看的任何地方都找不到答案。

我希望在多索引pandas groupby对象中拥有组的数量。请注意,这与组中的元素数量(使用.size())不同,也不是组的总数(使用len。请参阅here)。

最好用一个例子来说明。

让我们创建一个简单的数据框:

import pandas as pd
df = pd.DataFrame({'Group': ['gr1','gr1','gr2','gr2','gr3','gr3'],
                   'Kind': ['sweet','sour','sweet','sour','sweet','sour'],
                   'Values': [10,11,200,201,300,301]})

现在我们使用两列进行分组:

gr = df.groupby(['Group','Kind'])

这将生成所需的groupby对象。它总共有六个组,您可以通过以下方式进行验证:

len(gr)

我现在可以遍历这些组:

for key,group in gr:
    print key

这会产生以下结果:

('gr1', 'sour')
('gr1', 'sweet')
('gr2', 'sour')
('gr2', 'sweet')
('gr3', 'sour')
('gr3', 'sweet')

我们可以看到第一个键有3个唯一条目,第二个是2个唯一条目。

我正在寻找的东西是gr返回(3,2)而无法访问生成gr的原始数据集而不遍历groupby对象,构建一个列表,并找到其独特的元素。

1 个答案:

答案 0 :(得分:5)

我能想到的最短路可能是

>>> gr.dtypes.index.levshape
(3, 2)

基本上,我们需要以MultiIndex的形式处理组:

>>> gr.dtypes
              Group    Kind Values
Group Kind                        
gr1   sour   object  object  int64
      sweet  object  object  int64
gr2   sour   object  object  int64
      sweet  object  object  int64
gr3   sour   object  object  int64
      sweet  object  object  int64
>>> gr.dtypes.index
MultiIndex(levels=[['gr1', 'gr2', 'gr3'], ['sour', 'sweet']],
           labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]],
           names=['Group', 'Kind'])
>>> gr.dtypes.index.levels
FrozenList([['gr1', 'gr2', 'gr3'], ['sour', 'sweet']])
>>> gr.dtypes.index.levshape
(3, 2)

最初我在想

>>> pd.Series(gr.groups).index.levshape
(3, 2)

groups字典制作新索引,但看起来dtypes中的信息已经存在。