我正在寻找一种方法来获取GroupBy对象中所有键的列表,但我似乎无法通过文档或Google找到它。
肯定有一种通过键访问组的方法,如下所示:
df_gb = df.groupby(['EmployeeNumber'])
df_gb.get_group(key)
...所以我认为有一种方法可以访问GroupBy对象中键的列表(或类似内容)。我正在寻找这样的东西:
df_gb.keys
Out: [1234, 2356, 6894, 9492]
我想我可以循环遍历GroupBy对象并以这种方式获取密钥,但我认为必须有更好的方法。
答案 0 :(得分:36)
你可以通过.groups
对象上的属性groupby
访问它,这会返回一个dict,dict的键会为你提供组:
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')}
<强>更新强>
看起来是因为groups
的类型是dict
,因此当您致电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
这并不是很好,因为它没有被矢量化,但是如果你已经有了一个聚合对象,那么你就可以得到索引值:
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')
答案 1 :(得分:3)
EdChum答案的一个问题是,通过启动gp.groups.keys()
获取密钥会首先构建完整的组字典。在大型数据帧上,这是一个非常慢的操作,实际上使内存消耗翻了一番。迭代速度更快:
df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)})
gp = df.groupby('group')
keys = [key for key, _ in gp]
执行此列表理解使我16 s
进入了groupby对象,而我不得不在3分钟后中断gp.groups.keys()
。
答案 2 :(得分:1)
使用选项sort = False保留组键顺序
gp = df.groupby('group', sort=False)