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

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

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ół.


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').


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)

9

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

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

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)

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)

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

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


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.


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.


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


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.


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.