Як надрукувати груповий об’єкт


133

Я хочу надрукувати результат групування з 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

Під час друку після згрупування у «A» я маю наступне:

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

Я отримую правильний вихід з print df.groupby('A').head(). яка версія панд у вас?
Аміт Верма

Щойно я оновився до 0,13,1 як на робочому столі, так і на ноутбуці.
користувач3465658

1
Як щодо "переліку ()" об'єкта безпосередньо? І тоді ви можете маніпулювати / роздруковувати його як звичайну структуру даних.
Tropicpenguin

Наскільки я можу сказати, жодна відповідь не вдається отримати бажаний результат. У цьому конкретному прикладі найближче, що я міг знайти, було df.groupby(['A', 'B']).sum(), але воно не вийшло , якщо ('A', 'B')пари не будуть унікальними.
Ерік Думініл

Відповіді:


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")

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

Якщо ви просто шукаєте спосіб його відображення, ви можете скористатися описом ():

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

Це дає вам акуратний стіл.


6
Це акуратний стіл, але це не бажаний стіл.
Ерік Дюмініл

15

Я підтвердив, що поведінка head()змінюється між версіями 0,12 та 0,13. Це схоже на помилку для мене. Я створив випуск .

Але групова операція насправді не повертає DataFrame, відсортований за групами. .head()Метод трохи вводить в оману тут - це просто зручна функція , щоб ви повторно вивчити об'єкт (в даному випадку df) , які згруповані. Результатом groupbyє окремий вид об'єкта, GroupByоб'єкт. Ви повинні apply, transformабо filterповернутися до DataFrame або серії.

Якщо все, що ви хотіли зробити, було сортування за значеннями у стовпцях А, ви повинні використовувати df.sort('A').


4
Зауважте, що headнасправді це head(5)робиться так, що він показує перші 5 рядків, більш правильним є показ "кадру" df.groupby('A').apply(lambda x: x), що фактично є пастстру. Я гадаю, у вас може бути pass()метод.
Джефф


9

Крім того, інша проста альтернатива може бути:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)

7

Окрім попередніх відповідей:

Беручи свій приклад,

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

Тоді простий 1 рядок код

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

4

Дякуємо Сурі за хороші уявлення. Я б очистив його рішення і просто зробив:

for key, value in df.groupby('A'):
    print(key, value)

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 безпосередньо за допомогою оператора print, але ви можете побачити, повторивши групу за допомогою циклу, спробуйте цей код, щоб побачити групу за даними

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

У Блокноті Юпітера, якщо зробити наступне, він друкує приємну групувану версію об'єкта. 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 Object. І вихід виглядає добре. Незважаючи на те, що він створює ряд зайвих даних.


0

У пітоні 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

Більш інтерактивним способом


-2

для друку всіх (або довільно багатьох) рядків згрупованого df:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.