Получить все ключи из объекта GroupBy в Pandas
Я ищу способ получить список всех ключей в объекте GroupBy, но не могу найти такую функцию в документации и через Google.
Определенно есть способ получить доступ к группам по их ключам, например, вот так:
df_gb = df.groupby(['EmployeeNumber'])
df_gb.get_group(key)
...поэтому я предполагаю, что существует какой-то способ получить список (или что-то подобное) ключей в объекте GroupBy. Мне нужно что-то вроде этого:
df_gb.keys
Out: [1234, 2356, 6894, 9492]
Я понимаю, что мог бы просто пройтись по объекту GroupBy и получить ключи таким образом, но думаю, что должно быть более удобное решение. Как я могу получить список ключей из GroupBy объекта?
3 ответ(ов)
Вам нужно использовать параметр sort=False
в методе groupby
, чтобы сохранить порядок ключей групп. Пример кода будет выглядеть так:
gp = df.groupby('group', sort=False)
Это позволит сохранить порядок, в котором встречаются уникальные значения в столбце 'group', вместо сортировки их по умолчанию.
Вы можете получить доступ к группам через атрибут .groups
объекта groupby
. Это возвращает словарь, где ключи словаря представляют собой группы:
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')
Проблема с ответом EdChum заключается в том, что вызов gp.groups.keys()
сначала создает полную словарь групп, что является медленной операцией на больших DataFrame. Это приводит к удвоению потребления памяти. Итерация значительно быстрее:
df = pd.DataFrame({'group': list('bgaaabxeb'), 'val': np.arange(9)})
gp = df.groupby('group')
keys = [key for key, _ in gp]
Выполнение этого генератора списков заняло у меня 16 секунд на моем объекте groupby, тогда как я был вынужден прервать gp.groups.keys()
после 3 минут.
Как изменить порядок столбцов в DataFrame?
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Установить значение для конкретной ячейки в DataFrame pandas с использованием индекса
Выбор строки из pandas Series/DataFrame по целочисленному индексу