从Pandas中的GroupBy对象获取所有键

Nat*_*ate 24 python pandas

我正在寻找一种方法来获取GroupBy对象中所有键的列表,但我似乎无法通过文档或谷歌找到一个.

肯定有一种通过键访问组的方法,如下所示:

df_gb = df.groupby(['EmployeeNumber'])
df_gb.get_group(key)
Run Code Online (Sandbox Code Playgroud)

...所以我认为有一种方法可以访问GroupBy对象中键的列表(或类似内容).我正在寻找这样的东西:

df_gb.keys
Out: [1234, 2356, 6894, 9492]
Run Code Online (Sandbox Code Playgroud)

我想我可以循环遍历GroupBy对象并以这种方式获取密钥,但我认为必须有更好的方法.

EdC*_*ica 40

您可以通过对象.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])
Run Code Online (Sandbox Code Playgroud)

这是输出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')}
Run Code Online (Sandbox Code Playgroud)

更新

它看起来像是因为类型groups是a 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'])
Run Code Online (Sandbox Code Playgroud)

如果你打电话,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')}
Run Code Online (Sandbox Code Playgroud)

然后维护密钥顺序,围绕这个的黑客是访问.name每个组的属性:

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

Out[78]:
group
a    a
b    b
e    e
g    g
x    x
dtype: object
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)


Dr_*_*zuś 8

EdChum 的答案的一个问题是通过启动gp.groups.keys()首先构建完整的组字典来获取密钥。在大型数据帧上,这是一个非常慢的操作,它有效地使内存消耗加倍。迭代速度更快:

df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)})
gp = df.groupby('group')
keys = [key for key, _ in gp]
Run Code Online (Sandbox Code Playgroud)

执行这个列表理解让我16 s在我的 groupby 对象上,而我不得不gp.groups.keys()在 3 分钟后打断。