Stampa piuttosto un'intera serie / DataFrame di Pandas


655

Lavoro molto con Series e DataFrames sul terminale. Il valore predefinito __repr__per una serie restituisce un campione ridotto, con alcuni valori di testa e coda, ma il resto manca.

Esiste un modo integrato per stampare graziosamente l'intera serie / DataFrame? Idealmente, supporterebbe un corretto allineamento, forse i bordi tra le colonne e forse anche la codifica a colori per le diverse colonne.


19
L'output ridotto è dovuto alle opzioni predefinite che è possibile modificare utilizzando, pd.set_option('display.max_rows', 1000)ad esempio, la colorazione è qualcos'altro, presumo si stia parlando di colorare l'output repr HTML. Non penso che questo sia integrato.
EdChum,

2
@EdChum: grazie, lo sapevo display.max_rows, il problema è che la maggior parte delle volte voglio che l'output venga troncato. È solo occasionalmente che desidero vedere l'output completo. Potrei impostare l'opzione su un valore molto alto, utilizzare il valore predefinito __repr__, quindi ripristinare il valore, ma questo sembra un po 'ingombrante, e in tal caso potrei anche scrivere la mia funzione di stampa.
Dun Peal,

1
@EdChum: per quanto riguarda i colori - questo è un terminale a colori, quindi sarebbe bello avere ogni riga stampata in un colore diverso, per distinguere facilmente i valori tra loro. Pandas funziona bene con ipython, che utilizza funzionalità terminali avanzate - incluso il colore - quindi mi chiedevo se Pandas avesse alcune capacità di colorazione.
Dun Peal,

1
Uso Pandas in IPython Notebook piuttosto che IPython come shell terminale, non vedo alcuna opzione set_optionche supporti la colorazione, forse qualcosa che potrebbe essere fatto come un plugin per applicare alcuni CSS o la formattazione dell'output. Questo è l'unico modo in cui penso che tu possa ottenere questo risultato
EdChum,

Risposte:


867

Puoi anche usare option_context, con una o più opzioni:

with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
    print(df)

Ciò restituirà automaticamente le opzioni ai loro valori precedenti.

Se stai lavorando su jupyter-notebook, usando display(df)invece di print(df)userai la logica di visualizzazione ricca di jupyter (in questo modo) .


2
Grazie! Si noti che l'impostazione dei valori massimi per Nonedisattivarli. Utilizzando i with pd.option_context()documenti di opzione ciò che sta accadendo in modo molto chiaro ed esplicito, e rende chiaro come ottenere altre variazioni della produzione di formattazione che può essere desiderato, utilizzando ad esempio precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, e molti molti altri: pandas.pydata.org/pandas -docs / stable / options.html
nealmcb

37
Per chiunque si chieda: quando si utilizza jupyter, utilizzare display(df)invece diprint(df)
tsvikas il

3
cosa rappresenta 3 qui?
Mona Jalal,

1
Se il DataFrame è davvero grande, potrebbe avere senso scriverlo temporaneamente come .csv e usare il veloce visualizzatore csv di Jupyter Lab
Dan

Quel '3' per display.max_columns dovrebbe essere 'Nessuno' per impostare quel parametro option_context sul suo valore predefinito. Fisso.
Trutane,

607

Non è necessario modificare le impostazioni. C'è un modo semplice:

print(df.to_string())

1
Quante colonne hai? Ho controllato con 1300 colonne e funziona benissimo: da itertools importa combinazioni da stringa import ascii_letters df = pd.DataFrame (data = [[0] * 1326], indice = [0], colonne = [(a + b) per a, b in combinazioni (ascii_letters, 2)])
Andrey Shokhin

11
Utilizzando i with pd.option_context()documenti di opzione ciò che sta accadendo molto più chiaramente ed esplicitamente, e rende chiaro come ottenere altre variazioni della produzione di formattazione che può essere desiderato, utilizzando ad esempio precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, e molti molti altri: pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb

2
Preferisco le altre risposte perché nel mio esempio questo sembra strano se ho molte colonne e il mio schermo non è abbastanza largo da visualizzarle. I nomi e i dati delle colonne eseguiranno interruzioni di riga separate, quindi non è più facile vedere quali dati appartengono a quale nome di colonna.
Dremet,

9
Il richiedente ha richiesto una soluzione "bella stampa". Questo non lo è. Se questo fosse usato all'interno del Notebook Jupyter, il grazioso display integrato non verrebbe usato affatto. È meglio usarlo pd.set_option('display.max_rows', None)appena prima di stampare df.
LS

@LS ha testato sia pd.set_option ('display.max_rows', None) sia df.to_string () su un notebook Jupyter python 3.x e hanno prodotto lo stesso output quando sono stati stampati. Se la risposta sopra non ha funzionato per le versioni precedenti, ora funziona.
H Froedge,

166

Certo, se questo accade molto, fai una funzione come questa. È anche possibile configurarlo per il caricamento ogni volta che si avvia IPython: https://ipython.org/ipython-doc/1/config/overview.html

def print_full(x):
    pd.set_option('display.max_rows', len(x))
    print(x)
    pd.reset_option('display.max_rows')

Per quanto riguarda la colorazione, diventare troppo elaborato con i colori mi sembra controproducente, ma sono d'accordo che qualcosa come Bootstrap.table-striped sarebbe bello. Puoi sempre creare un problema per suggerire questa funzione.


5
Il link è morto. Forse dovrebbe essere ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach,

2
Sarebbe bello se qualcuno, chiunque, persino l'autore, potesse verificare e correggere il link e contrassegnare questi commenti come obsoleti.
Aaron Hall

Ciò è negativo, poiché si presume che l'opzione sia stata impostata come predefinita prima dell'operazione di stampa, il che non è necessariamente il caso e potrebbe quindi portare a comportamenti imprevisti. L'uso del contesto dell'opzione insieme all'istruzione with è l'opzione più solida e tornerà a tutto ciò che è stato impostato in precedenza.
inVader,

104

Dopo aver importato i panda, in alternativa all'utilizzo del gestore del contesto, impostare tali opzioni per visualizzare interi frame di dati:

pd.set_option('display.max_columns', None)  # or 1000
pd.set_option('display.max_rows', None)  # or 1000
pd.set_option('display.max_colwidth', -1)  # or 199

Per l'elenco completo delle opzioni utili, vedere:

pd.describe_option('display')

1
Grazie per averlo aggiunto. "Nessuno" è molto meglio della lunghezza effettiva di ogni singolo frame di dati se si desidera visualizzare più di un frame di dati.
Dremet,

5
@Corrumpo Per alcune opzioni dovresti usare -1int value invece di None, se vuoi una rappresentazione completa
lucidyan

Il prefisso display.nel nome dell'opzione non sembra essere necessario. Ad esempio, set_option('max_columns')funziona ugualmente bene.
Acumenus,

Grazie mille :)
Orsiris de Jong,

45

Usa il pacchetto tabulate:

pip install tabulate

E considera il seguente esempio di utilizzo:

import pandas as pd
from io import StringIO
from tabulate import tabulate

c = """Chromosome Start End
chr1 3 6
chr1 5 7
chr1 8 9"""

df = pd.read_table(StringIO(c), sep="\s+", header=0)

print(tabulate(df, headers='keys', tablefmt='psql'))

+----+--------------+---------+-------+
|    | Chromosome   |   Start |   End |
|----+--------------+---------+-------|
|  0 | chr1         |       3 |     6 |
|  1 | chr1         |       5 |     7 |
|  2 | chr1         |       8 |     9 |
+----+--------------+---------+-------+

tabulate va in tilt quando si stampa un pd.Series.
eliu,

2
@eliu Grazie per le informazioni. Hai semprepd_series.to_frame()
The Unfun Cat,

20

Se si utilizza Ipython Notebook (Jupyter). Puoi usare HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))

1
si prega di mostrare l'output per il confronto con altre soluzioni, Tnx.
vwvan

7
Fai attenzione a provare a mostrare un grande Dataframe con questo. La memoria potrebbe essere esaurita e non sarà più possibile riaprire il blocco note a meno che non si modifichi il codice non elaborato nel file .ipyndb. Storia vera;)
FLBKernel

Questa è l'opzione migliore per me. La tabella viene visualizzata per intero con colorazione. Ben fatto!
Ololade il

20

utilizzando pd.options.display

Questa risposta è una variazione della risposta precedente di lucidyan . Rende il codice più leggibile evitando l'uso diset_option .

Dopo aver importato i panda, in alternativa all'utilizzo del gestore del contesto, impostare tali opzioni per la visualizzazione di frame di dati di grandi dimensioni:

def set_pandas_display_options() -> None:
    # Ref: https://stackoverflow.com/a/52432757/
    display = pd.options.display

    display.max_columns = 1000
    display.max_rows = 1000
    display.max_colwidth = 199
    display.width = None
    # display.precision = 2  # set as needed

set_pandas_display_options()

Successivamente, è possibile utilizzare uno display(df)o solo dfse si utilizza un notebook, altrimenti print(df).

utilizzando to_string

Pandas 0.25.3 ha DataFrame.to_stringe Series.to_stringmetodi che accettano le opzioni di formattazione.

utilizzando to_markdown

Se ciò di cui hai bisogno è l'output di markdown, Pandas 1.0.0 ha DataFrame.to_markdowne Series.to_markdownmetodi.

utilizzando to_html

Se ciò di cui hai bisogno è l'output HTML, Pandas 0.25.3 ha un DataFrame.to_htmlmetodo ma non un Series.to_html. Si noti che a Seriespuò essere convertito in a DataFrame.


Sì, questo sembra un modo più elegante per la visualizzazione in Jupyter invece di set_option. C'è un modo per allineare a sinistra l'output visualizzato? Le righe a destra del frame di dati visualizzato sono allineate a destra per impostazione predefinita.
vinsinraw,

11

Prova questo

pd.set_option('display.height',1000)
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)

3

È possibile ottenere ciò utilizzando il metodo seguente. basta passare il totale no. delle colonne presenti nel DataFrame come arg a

'' display.max_columns

Ad esempio:

df= DataFrame(..)
with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
    print(df)

-1

Prova a utilizzare la funzione display (). Questo userebbe automaticamente le barre di scorrimento orizzontale e verticale e con questo puoi visualizzare facilmente diversi set di dati invece di usare print ().

display(dataframe)

display () supporta anche un corretto allineamento.

Tuttavia, se si desidera rendere il set di dati più bello, è possibile verificare pd.option_context(). Ha molte opzioni per mostrare chiaramente il frame di dati.

Nota: sto usando i notebook Jupyter.

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.