我的问题很简单,但在我看的任何地方都找不到答案。
我希望在多索引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对象,构建一个列表,并找到其独特的元素。
答案 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
中的信息已经存在。