Как распечатать объект groupby

134

Я хочу распечатать результат группировки с помощью Pandas.

У меня есть фреймворк:

import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)

       A  B
0    one  0
1    one  1
2    two  2
3  three  3
4  three  4
5    one  5

При печати после группировки по букве «А» у меня есть следующее:

print(df.groupby('A'))

<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>

Как распечатать сгруппированный фрейм данных?

Если я сделаю:

print(df.groupby('A').head())

Я получаю фрейм данных, как если бы он не был сгруппирован:

             A  B
A                
one   0    one  0
      1    one  1
two   2    two  2
three 3  three  3
      4  three  4
one   5    one  5

Я ожидал чего-то вроде:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4
user3465658
источник
Я получаю правильный результат с помощью print df.groupby('A').head(). какая у вас версия панд?
Амит Верма,
Я только что обновился до версии 0.13.1 на своем компьютере и ноутбуке.
user3465658
1
Как насчет того, чтобы напрямую "перечислить ()" объект? И затем вы можете манипулировать / распечатать его как обычную структуру данных.
Tropicpenguin
Насколько я могу судить, ни один ответ не дает желаемого результата. Для этого конкретного примера я мог найти самое близкое, но не получилось df.groupby(['A', 'B']).sum(), если ('A', 'B')пары не уникальны.
Eric

Ответы:

100

Просто сделайте:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

Это тоже работает,

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

Для выборочной группировки клавиш: вставьте нужные клавиши внутрь key_list_from_gb, как показано ниже, используя gb.keys(): Например,

gb = grouped_df.groups
gb.keys()

key_list_from_gb = [key1, key2, key3]

for key, values in gb.items():
    if key in key_list_from_gb:
        print(df.ix[values], "\n")
Surya
источник
1
Другой вариант:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen
__iter __ () также работает. Он возвращает генератор, дающий последовательность (имя, подмножество объектов) для каждой группы
Jeremy Z
Почему бы не зацикливаться key_list_from_gb?
pfnuesel
66

Если вы просто ищете способ отобразить это, вы можете использовать description ():

grp = df.groupby['colName']
grp.describe()

Это дает вам аккуратный стол.

Swagath
источник
7
Это аккуратный стол, но это не тот стол, который нам нужен.
Eric
15

Я подтвердил, что поведение head()изменений между версиями 0.12 и 0.13. Мне это кажется ошибкой. Я создал проблему .

Но операция groupby на самом деле не возвращает DataFrame, отсортированный по группе. Этот .head()метод здесь немного вводит в заблуждение - это просто удобная функция, позволяющая повторно изучить объект (в данном случае df), который вы сгруппировали. Результатом groupbyявляется отдельный вид объекта, GroupByобъект. Вы должны apply, transformили, filterчтобы вернуться к DataFrame или Series.

Если все, что вы хотели сделать, это отсортировать по значениям в столбце A, вам следует использовать df.sort('A').

Дэн Аллан
источник
4
обратите внимание, что headна самом деле он делает head(5)то, что показывает первые 5 строк, более правильным является «показать» фрейм df.groupby('A').apply(lambda x: x), который, по сути, является Passthru. Я полагаю, у вас может быть pass()метод.
Джефф,
13

Еще одна простая альтернатива:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)
Сумит Похрел
источник
9

Также другой простой альтернативой может быть:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
Surya
источник
7

В дополнение к предыдущим ответам:

Взяв ваш пример,

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

Затем простой однострочный код

df.groupby('A').apply(print)
QPeiran
источник
4

Спасибо Сурье за ​​хорошие идеи. Я бы очистил его решение и просто сделал:

for key, value in df.groupby('A'):
    print(key, value)
mimoralea
источник
3

Список вызовов () объекта GroupBy

print(list(df.groupby('A')))

дает тебе:

[('one',      A  B
0  one  0
1  one  1
5  one  5), ('three',        A  B
3  three  3
4  three  4), ('two',      A  B
2  two  2)]
Элизабет Оррико
источник
Да, для этого нужно больше голосов! Вы можете сделать это также после того, как сгруппируете объект. df_g = df.groupby ('A'), тогда вы можете вызвать список (df_g) или, если вам просто нужен первый список группового вызова (df_g) [0]. Это то, что мне нравится в R по сравнению с Python. В R вам не нужно выполнять итерацию по большинству объектов, чтобы увидеть данные, но в Python вам нужно работать со многими объектами. Обнаружение подобных действий освежает. Спасибо Элизабет.
PVic
2

вы не можете увидеть данные groupBy непосредственно с помощью оператора печати, но вы можете увидеть, перебирая группу с помощью цикла for, попробуйте этот код, чтобы увидеть группу по данным

group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
  print(A)
  print(A_df)

вы получите результат после того, как попробуете это как результат группы

Я надеюсь, что это помогает

Правин Кумар
источник
2

В Jupyter Notebook, если вы сделаете следующее, он распечатает красивую сгруппированную версию объекта. applyМетод помогает в создании мультииндексных dataframe.

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])

Вывод:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2

Если вы хотите, чтобы byстолбцы не отображались в выводе, просто отбросьте столбцы, например.

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])

Вывод:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2

Здесь я не уверен, почему .iloc[:]не работает, а [:]не в конце. Так что, если в будущем возникнут какие-то проблемы из-за обновлений (или в настоящее время), .iloc[:len(a)]тоже работает.

Барник Бисвас
источник
0

Я нашел хитрый способ, просто для мозгового штурма, посмотрите код:

df['a'] = df['A']  # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)

выход:

             B
A     a
one   one    0
      one    1
      one    5
three three  3
      three  4
two   two    2

Плюсы так легко распечатать, поскольку он возвращает фрейм данных вместо объекта Groupby. И результат выглядит неплохо. Минус в том, что он создает серию избыточных данных.

Шэн Чжуан
источник
0

В Python 3

k = None
for name_of_the_group, group in dict(df_group):
    if(k != name_of_the_group):
        print ('\n', name_of_the_group)
        print('..........','\n')
    print (group)
    k = name_of_the_group

Более интерактивным способом

Дипаншу Мехта
источник
0

df.groupby ('ключ, по которому вы хотите сгруппировать'). apply (печать)

Как упомянул другой участник, это самое легкое и простое решение для визуализации объекта groupby.

Картик Мамудур
источник
1
Добро пожаловать, Картик, это тот же ответ, что и у QPeiran ?
RichieV
-2

чтобы напечатать все (или произвольно много) строк сгруппированного df:

import pandas as pd
pd.set_option('display.max_rows', 500)

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
randomWalk112358
источник