Come stampare un oggetto groupby


134

Voglio stampare il risultato del raggruppamento con Panda.

Ho un dataframe:

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

Quando si stampa dopo il raggruppamento per "A" ho quanto segue:

print(df.groupby('A'))

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

Come posso stampare il dataframe raggruppato?

Se lo faccio:

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

Ottengo il dataframe come se non fosse raggruppato:

             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

Mi aspettavo qualcosa del tipo:

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

Sto ottenendo un output corretto con print df.groupby('A').head(). che versione di panda hai?
Amit Verma

Ho appena aggiornato alla 0.13.1 sia sul mio desktop che sul mio laptop.
user3465658

1
Che ne dici di "list ()" l'oggetto direttamente? E poi puoi manipolarlo / stamparlo come una normale struttura dati.
Tropicpenguin

Per quanto ne so, nessuna risposta riesce a produrre l'output desiderato. Per questo esempio specifico, il più vicino che ho trovato è stato df.groupby(['A', 'B']).sum(), ma fallirebbe se le ('A', 'B')coppie non fossero uniche.
Eric Duminil

Risposte:


100

Basta fare:

grouped_df = df.groupby('A')

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

Funziona anche

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

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

Per il raggruppamento selettivo delle chiavi: inserire le chiavi desiderate all'interno di key_list_from_gb, di seguito, utilizzando gb.keys(): Ad esempio,

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
Un'altra opzione è:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ (funziona anche). Restituisce Generator che restituisce la sequenza di (nome, oggetto con sottoinsiemi) per ogni gruppo
Jeremy Z

Perché non fare un giro key_list_from_gbperò?
pfnuesel

66

Se stai semplicemente cercando un modo per visualizzarlo, potresti usare descrivere ():

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

Questo ti dà un tavolo pulito.


7
È un tavolo pulito ma non è il tavolo desiderato.
Eric Duminil

15

Ho confermato che il comportamento delle head()modifiche tra la versione 0.12 e 0.13. A me sembra un insetto. Ho creato un problema .

Ma un'operazione groupby in realtà non restituisce un DataFrame ordinato per gruppo. Il .head()metodo in questo caso è un po 'fuorviante: è solo una comoda funzione che ti consente di riesaminare l'oggetto (in questo caso df) che hai raggruppato. Il risultato groupbyè un tipo separato di oggetto, un GroupByoggetto. È necessario apply, transformo filterper tornare a un DataFrame o a una serie.

Se tutto ciò che volevi fare era ordinare in base ai valori nelle colonne A, dovresti usare df.sort('A').


4
nota che in headrealtà sta facendo head(5)iow sta mostrando le prime 5 righe, più corretto per 'mostrare' il frame è df.groupby('A').apply(lambda x: x), che è effettivamente un passante. Suppongo che potresti avere un pass()metodo, forse.
Jeff

13

Un'altra semplice alternativa:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

9

Inoltre, un'altra semplice alternativa potrebbe essere:

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

7

Oltre alle risposte precedenti:

Prendendo il tuo esempio,

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

Quindi semplice codice di 1 riga

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

4

Grazie a Surya per le buone intuizioni. Pulirei la sua soluzione e farei semplicemente:

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

3

Elenco chiamate () sull'oggetto GroupBy

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

ti dà:

[('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)]

Sì, questo richiede più voti! Puoi farlo anche dopo aver raggruppato l'oggetto. df_g = df.groupby ('A') allora puoi chiamare l'elenco (df_g) o se vuoi solo il primo elenco di chiamate di gruppo (df_g) [0]. Questa è una cosa che mi piace di R su Python. In R non devi iterare attraverso la maggior parte degli oggetti per vedere i dati, ma in Python devi farlo su molti oggetti. Trovare processi come questo è rinfrescante. Grazie Elisabetta.
PVic

2

non puoi vedere i dati groupBy direttamente dall'istruzione print ma puoi vedere iterando sul gruppo usando il ciclo for prova questo codice per vedere il gruppo in base ai dati

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)

otterrai un output dopo averlo provato come risultato di groupby

spero possa essere d'aiuto


2

In Jupyter Notebook, se si esegue quanto segue, viene stampata una bella versione raggruppata dell'oggetto. Il applymetodo aiuta nella creazione di un dataframe multiindex.

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

Produzione:

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

Se vuoi che le bycolonne non appaiano nell'output, rilascia semplicemente le colonne, in questo modo.

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

Produzione:

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

Qui, non sono sicuro del motivo per cui .iloc[:]non funziona invece che [:]alla fine. Quindi, se ci sono alcuni problemi in futuro a causa di aggiornamenti (o al momento), .iloc[:len(a)]funziona anche.


0

Ho trovato un modo complicato, solo per il brainstorming, guarda il codice:

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)

Il risultato:

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

Il pro è così facile da stampare, in quanto restituisce un dataframe, invece di Groupby Object. E l'output sembra carino. Lo svantaggio è che crea una serie di dati ridondanti.


0

In 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

In modo più interattivo


-2

per stampare tutte (o arbitrariamente molte) righe del df raggruppato:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.