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