2017-02-28 85 views
5

我正在寻找一种方法来获取GroupBy对象中所有密钥的列表,但似乎无法通过文档或通过Google找到它。从Pandas中的GroupBy对象获取所有密钥

肯定是有通过他们的键访问组,像这样的方式:

df_gb = df.groupby(['EmployeeNumber']) 
df_gb.get_group(key) 

...所以我想,有访问一个键的列表(或类似)的方式GroupBy对象。我在寻找这样的事情:

df_gb.keys 
Out: [1234, 2356, 6894, 9492] 

我想我可以只通过的GroupBy对象循环,拿到钥匙这种方式,但我认为我们有了一个更好的办法。

回答

7

您可以groupby对象通过属性.groups访问此,这将返回一个字典,该字典的钥匙给你组:

In [40]: 
df = pd.DataFrame({'group':[0,1,1,1,2,2,3,3,3], 'val':np.arange(9)}) 
gp = df.groupby('group') 
gp.groups.keys() 

Out[40]: 
dict_keys([0, 1, 2, 3]) 

这里是从groups输出:

In [41]: 
gp.groups 

Out[41]: 
{0: Int64Index([0], dtype='int64'), 
1: Int64Index([1, 2, 3], dtype='int64'), 
2: Int64Index([4, 5], dtype='int64'), 
3: Int64Index([6, 7, 8], dtype='int64')} 

更新

它看起来像那样,因为类型的groupsdict然后当你调用keys组顺序是不维护:

In [65]: 
df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)}) 
gp = df.groupby('group') 
gp.groups.keys() 

Out[65]: 
dict_keys(['b', 'e', 'g', 'a', 'x']) 

如果你打电话groups你可以看到为了维持:

In [79]: 
gp.groups 

Out[79]: 
{'a': Int64Index([2, 3, 4], dtype='int64'), 
'b': Int64Index([0, 5, 8], dtype='int64'), 
'e': Int64Index([7], dtype='int64'), 
'g': Int64Index([1], dtype='int64'), 
'x': Int64Index([6], dtype='int64')} 

然后键顺序保持,解决此一劈是访问.name属性各组:

In [78]: 
gp.apply(lambda x: x.name) 

Out[78]: 
group 
a a 
b b 
e e 
g g 
x x 
dtype: object 

whic h不是很好,因为这不是矢量化的,但是如果你已经有一个聚合对象,那么你可以得到索引值:

In [81]: 
agg = gp.sum() 
agg 

Out[81]: 
     val 
group  
a  9 
b  13 
e  7 
g  1 
x  6 

In [83]:  
agg.index.get_level_values(0) 

Out[83]: 
Index(['a', 'b', 'e', 'g', 'x'], dtype='object', name='group') 
+0

Thanks for this。这个方法会保持和我循环一样的顺序吗?我只是想确保这会与我拥有的其他一些数据同步。 – Nate

+0

感谢您的帮助! – Nate

+0

'groups'将值作为组的索引 - 从这些索引获取实际列值的快速内置方法? –