Python Pandas GroupBy получить список групп

У меня есть строка кода:

g = x.groupby('Color')

Цвета: красный, синий, зеленый, желтый, фиолетовый, оранжевый и черный. Как вернуть этот список? Для подобных атрибутов я использую x.Attribute, и он отлично работает, но x.Color не ведет себя одинаково.

Ответ 1

Существует гораздо более простой способ сделать это:

g = x.groupby('Color')

g.groups.keys()

Выполняя groupby() pandas, вы получаете диктовку сгруппированных DF. Вы можете легко получить список ключей этого dict с помощью python, встроенного в функцию keys().

Ответ 2

Если вы не заботитесь о порядке групп, ответ Yanqi Ma будет работать нормально:

g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this

Тем не менее, обратите внимание, что g.groups является словарем, поэтому ключи изначально неупорядочены! Это имеет место, даже если вы используете sort=True в методе groupby для сортировки групп, что по умолчанию верно.

Это на самом деле сильно меня задело, когда получилось по-разному на двух платформах, тем более что я использовал list(g.groups), поэтому сначала не было очевидно, что g.groups был dict.

На мой взгляд, лучший способ сделать это - воспользоваться тем фактом, что у объекта GroupBy есть итератор, и использовать понимание списка, чтобы возвращать группы в порядке их существования в объекте GroupBy:

g = x.groupby('Color')
groups = [name for name,unused_df in g]

Это немного менее читабельно, но это всегда будет возвращать группы в правильном порядке.

Ответ 3

Я понимаю, что у вас есть Data Frame, который содержит кратные столбцы. Один из столбцов - "Цвет", который имеет разные типы цветов. Вы хотите вернуть список уникальных цветов, которые существуют.

colorGroups = df.groupby(['Color'])
for c in colorGroups.groups: 
    print c

Приведенный выше код даст вам все цвета, которые существуют, не повторяя названия цветов. Таким образом, вы должны получить результат, например:

Red
Blue
Green
Yellow
Purple
Orange
Black

Альтернативой является функция unique(), которая возвращает массив всех уникальных значений в серии. Таким образом, чтобы получить массив всех уникальных цветов, вы бы сделали:

df['Color'].unique()

Выход представляет собой массив, поэтому, например, print df['Color'].unique()[3] предоставит вам Yellow.

Ответ 4

Вот как это сделать.

groups = list()
for g, data in x.groupby('Color'):
    print(g, data)
    groups.append(g)

Основная идея здесь заключается в следующем: если вы перебираете группу данных с помощью итератора, вы получите два кортежа (имя группы, фильтрованный фрейм данных), где фрейм фильтрованных данных содержит только записи, соответствующие этой группе).