Jak wydrukować obiekt grupowania

134

Chcę wydrukować wynik grupowania z Pandami.

Mam ramkę danych:

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

Podczas drukowania po pogrupowaniu według „A” mam:

print(df.groupby('A'))

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

Jak mogę wydrukować zgrupowane ramki danych?

Jeśli zrobię:

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

Otrzymuję ramkę danych tak, jakby nie była zgrupowana:

             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

Spodziewałem się czegoś takiego:

             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
źródło
Otrzymuję prawidłowe dane wyjściowe z print df.groupby('A').head(). jaką masz wersję pand?
Amit Verma
Właśnie zaktualizowałem do wersji 0.13.1 na moim komputerze stacjonarnym i laptopie.
user3465658
1
Co powiesz na bezpośrednie wyświetlenie obiektu na liście ()? Następnie możesz manipulować / drukować to jako normalną strukturę danych.
Tropicpenguin
O ile wiem, żadna odpowiedź nie daje oczekiwanego wyniku. W tym konkretnym przykładzie najbliższe, jakie udało mi się znaleźć, było df.groupby(['A', 'B']).sum(), ale zawiodłoby, gdyby ('A', 'B')pary nie były unikalne.
Eric Duminil

Odpowiedzi:

100

Po prostu zrób:

grouped_df = df.groupby('A')

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

To też działa,

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

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

W celu selektywnego grupowania kluczy: Wstaw żądane klucze do key_list_from_gb, w następujący sposób, używając gb.keys(): Na przykład,

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
źródło
1
Inną opcją jest:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen
__iter __ () również działa. Zwraca Generator generujący sekwencję (nazwa, obiekt z podziałem) dla każdej grupy
Jeremy Z
Dlaczego jednak nie zapętlić key_list_from_gb?
pfnuesel
66

Jeśli po prostu szukasz sposobu na wyświetlenie tego, możesz użyć opisywania ():

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

To daje schludny stół.

Swagath
źródło
7
To schludny stół, ale nie jest to pożądany stół.
Eric Duminil
15

Potwierdziłem, że zachowanie head()zmian między wersją 0.12 a 0.13. Dla mnie to wygląda na błąd. Stworzyłem problem .

Ale operacja grupowania w rzeczywistości nie zwraca elementu DataFrame posortowanego według grupy. .head()Metoda jest trochę mylące tutaj - to tylko funkcja umożliwiająca pozwolić ci ponownego zbadania obiekcie (w tym przypadku df), które grupowane. Rezultatem groupbyjest odrębny rodzaj obiektu, GroupByprzedmiot. Musisz apply, transformlub filterwrócić do DataFrame lub serialu.

Jeśli wszystko, co chciałeś zrobić, to posortować według wartości w kolumnach A, powinieneś użyć df.sort('A').

Dan Allan
źródło
4
zwróć uwagę, że headfaktycznie robi head(5)to tak, że pokazuje pierwsze 5 wierszy, bardziej poprawne jest „pokazanie” ramki df.groupby('A').apply(lambda x: x), co jest faktycznie przejściem. Przypuszczam, że mógłbyś mieć pass()metodę.
Jeff
13

Kolejna prosta alternatywa:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)
Sumit Pokhrel
źródło
9

Ponadto inną prostą alternatywą może być:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
Surya
źródło
7

Oprócz poprzednich odpowiedzi:

Biorąc twój przykład,

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

Następnie prosty 1-wierszowy kod

df.groupby('A').apply(print)
QPeiran
źródło
4

Dzięki Surya za dobre spostrzeżenia. Oczyściłbym jego rozwiązanie i po prostu zrobiłbym:

for key, value in df.groupby('A'):
    print(key, value)
mimoralea
źródło
3

Lista wywołań () w obiekcie GroupBy

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

daje Ci:

[('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)]
Elizabeth Orrico
źródło
Tak, to wymaga większej liczby głosów! Możesz to zrobić również po zgrupowaniu obiektu. df_g = df.groupby ('A') to możesz wyświetlić listę połączeń (df_g) lub jeśli chcesz tylko pierwszą listę połączeń grupowych (df_g) [0]. To jedna rzecz, którą lubię w R zamiast Pythona. W R nie musisz iterować przez większość obiektów, aby zobaczyć dane, ale w Pythonie musisz na wielu obiektach. Znajdowanie takich procesów jest odświeżające. Dzięki Elizabeth.
PVic
2

nie możesz zobaczyć danych groupBy bezpośrednio za pomocą instrukcji print ale możesz zobaczyć iterując po grupie za pomocą pętli for wypróbuj ten kod, aby zobaczyć grupę według danych

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)

otrzymasz wynik po wypróbowaniu tego jako wynik grupowania

Mam nadzieję, że to pomoże

praveen kumar
źródło
2

W Jupyter Notebook, jeśli wykonasz następujące czynności, wydrukuje ładną zgrupowaną wersję obiektu. applyMetoda pomaga w tworzeniu multiindex dataframe.

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

Wynik:

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

Jeśli chcesz, aby bykolumny nie pojawiały się w wynikach, po prostu upuść kolumny, w ten sposób.

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

Wynik:

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

Tutaj nie jestem pewien, dlaczego .iloc[:]nie działa zamiast [:]na końcu. Tak więc, jeśli w przyszłości pojawią się problemy z powodu aktualizacji (lub obecnie), .iloc[:len(a)]również działa.

Barnik Biswas
źródło
0

Znalazłem trudny sposób, tylko na burzę mózgów, zobacz kod:

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)

wyjście:

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

Zalety są tak łatwe do wydrukowania, że ​​zwraca ramkę danych zamiast Groupby Object. A wyjście wygląda ładnie. Chociaż wadą jest to, że tworzy serię nadmiarowych danych.

Sheng Zhuang
źródło
0

W Pythonie 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

W bardziej interaktywny sposób

Deepanshu Mehta
źródło
0

df.groupby ('klucz, według którego chcesz pogrupować'). zastosuj (drukuj)

Jak wspomniał inny członek, jest to najłatwiejsze i najprostsze rozwiązanie do wizualizacji obiektu grupowego.

Karthik Mamudur
źródło
1
Witaj Karthik, czy to ta sama odpowiedź, co QPeiran ?
RichieV
-2

aby wydrukować wszystkie (lub dowolnie wiele) wierszy zgrupowanego df:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
randomWalk112358
źródło