Подтвердить что ты не робот

Получить все ключи из объекта GroupBy в Pandas

Я ищу способ получить список всех ключей в объекте GroupBy, но я не могу найти его через документы или через Google.

Существует определенно способ доступа к группам через их ключи, например:

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

... поэтому я вижу способ доступа к списку (или тому подобному) ключей в объекте GroupBy. Я ищу что-то вроде этого:

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

Я полагаю, что я мог бы просто пропустить объект GroupBy и получить ключи таким образом, но я думаю, что должен быть лучший способ.

4b9b3361

Ответ 1

Вы можете получить доступ к этому через атрибут .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')

Ответ 2

Используйте параметр sort = False, чтобы зарезервировать порядок ключей группы gp = df.groupby('group', sort=False)