Drucken Sie eine ganze Pandas-Serie / einen Datenrahmen hübsch aus

648

Ich arbeite viel mit Serien und DataFrames am Terminal. Die Standardeinstellung __repr__für eine Serie gibt eine reduzierte Stichprobe mit einigen Kopf- und Endwerten zurück, der Rest fehlt jedoch.

Gibt es eine integrierte Möglichkeit, die gesamte Serie / den gesamten DataFrame hübsch zu drucken? Im Idealfall würde es die richtige Ausrichtung unterstützen, möglicherweise Ränder zwischen Spalten und möglicherweise sogar die Farbcodierung für die verschiedenen Spalten.

Dun Peal
quelle
19
Die reduzierte Ausgabe ist auf die Standardoptionen zurückzuführen, die Sie pd.set_option('display.max_rows', 1000)beispielsweise ändern können. Die Färbung ist etwas anderes. Ich gehe davon aus, dass Sie über das Färben der HTML-Repr-Ausgabe sprechen. Ich denke nicht, dass dies überhaupt eingebaut ist.
EdChum
2
@EdChum: Danke, ich wusste davon display.max_rows, das Problem ist, dass ich die meiste Zeit möchte, dass die Ausgabe abgeschnitten wird. Es ist nur gelegentlich, dass ich die volle Ausgabe sehen möchte. Ich könnte die Option auf einen sehr hohen Wert setzen, die Standardeinstellung verwenden __repr__und dann den Wert zurücksetzen, aber das scheint etwas umständlich zu sein, und in diesem Fall könnte ich auch meine eigene hübsche Druckfunktion schreiben.
Dun Peal
1
@EdChum: in Bezug auf Farben - dies ist ein Farbterminal, daher wäre es schön, wenn jede Zeile in einer anderen Farbe gedruckt würde, um Werte leicht voneinander zu unterscheiden. Pandas funktioniert gut mit ipython, das erweiterte Terminalfunktionen - einschließlich Farbe - verwendet. Daher habe ich mich gefragt, ob Pandas selbst über einige Farbfunktionen verfügt.
Dun Peal
1
Ich verwende Pandas in IPython Notebook anstelle von IPython als Terminal-Shell. Ich sehe keine Optionen set_option, die die Farbgebung unterstützen. Dies könnte möglicherweise als Plugin zum Anwenden von CSS- oder Ausgabeformatierungen erfolgen. Dies ist der einzige Weg, wie ich denke, dass Sie dies erreichen können
EdChum

Antworten:

861

Sie können auch die option_contextmit einer oder mehreren Optionen verwenden:

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

Dadurch werden die Optionen automatisch auf ihre vorherigen Werte zurückgesetzt.

Wenn Sie an einem Jupyter-Notebook arbeiten, wird bei Verwendung von display(df)anstelle von print(df)eine jupyterreiche Anzeigelogik verwendet (wie so) .

tsvikas
quelle
2
Vielen Dank! Beachten Sie, dass Sie die Maximalwerte so einstellen, dass Nonesie ausgeschaltet werden. Mit Hilfe der with pd.option_context()Option Dokumente , welche auf sehr klar wird und explizit, und es wird deutlich , wie andere Änderungen in der Ausgabe zu erreichen , dass die Formatierung erwünscht sein kann, zB mit precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, und viele viele mehr: pandas.pydata.org/pandas -docs / Stable / Options.html
Nealmcb
37
Für alle, die sich fragen: Wenn Sie Jupyter verwenden, verwenden Sie display(df)anstelle vonprint(df)
tsvikas
3
Was bedeutet 3 hier?
Mona Jalal
1
Wenn der DataFrame wirklich groß ist, kann es sinnvoll sein, ihn vorübergehend als CSV-Datei zu schreiben und den schnellen CSV-Viewer von Jupyter Lab zu verwenden
Dan,
Diese '3' für display.max_columns sollte 'None' sein, um diesen option_context-Parameter auf seinen Standardwert zu setzen. Fest.
Trutane
605

Einstellungen müssen nicht gehackt werden. Es gibt einen einfachen Weg:

print(df.to_string())
Andrey Shokhin
quelle
1
Wie viele Spalten haben Sie? Ich habe mit 1300 Spalten geprüft und es funktioniert gut: aus itertools Importkombinationen aus String importieren ascii_letters df = pd.DataFrame (data = [[0] * 1326], index = [0], column = [(a + b)) für a, b in Kombinationen (ascii_letters, 2)])
Andrey Shokhin
11
Verwendung der with pd.option_context() Option Dokumente , welche auf viel wird mehr klar und deutlich, und es wird deutlich , wie andere Änderungen in der Ausgabe zu erreichen , dass die Formatierung erwünscht sein kann, zB mit precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, und viele viele mehr: pandas.pydata.org/ pandas-docs / stabile / options.html
nealmcb
2
Ich bevorzuge die anderen Antworten, da dies in meinem Beispiel seltsam aussieht, wenn ich viele Spalten habe und mein Bildschirm nicht breit genug ist, um sie anzuzeigen. Spaltennamen und Daten führen separate Zeilenumbrüche durch, sodass nicht mehr leicht zu erkennen ist, welche Daten zu welchem ​​Spaltennamen gehören.
Dremet
9
Der Fragesteller forderte eine "Pretty-Print" -Lösung an. Das ist es nicht . Wenn dies in Jupyter Notebook verwendet würde, würde das eingebaute hübsche Display überhaupt nicht verwendet. Es ist besser, pd.set_option('display.max_rows', None)kurz vor dem Drucken zu verwendendf .
LS
@LS hat sowohl pd.set_option ('display.max_rows', None) als auch df.to_string () auf einem Python 3.x Jupyter-Notebook getestet und beim Drucken dieselbe Ausgabe erzeugt. Wenn die obige Antwort für frühere Versionen nicht funktioniert hat, ist dies jetzt der Fall.
H Froedge
166

Sicher, wenn dies häufig vorkommt, machen Sie eine Funktion wie diese. Sie können es sogar so konfigurieren, dass es bei jedem Start von IPython geladen wird: 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')

Was das Färben angeht, klingt es für mich kontraproduktiv, mit Farben zu aufwändig umzugehen, aber ich stimme zu, dass so etwas wie Bootstraps.table-striped schön wäre. Sie können jederzeit ein Problem erstellen , um diese Funktion vorzuschlagen.

Dan Allan
quelle
5
Der Link ist tot. Vielleicht sollte es ipython.org/ipython-doc/dev/config/intro.html sein ?
Ostrokach
2
Es wäre großartig, wenn jemand, jemand, vielleicht sogar der Autor, den Link überprüfen und reparieren und diese Kommentare als veraltet markieren könnte.
Aaron Hall
Dies ist schlecht, da davon ausgegangen wird, dass die Option vor dem Druckvorgang auf den Standardwert gesetzt wurde, was nicht unbedingt der Fall ist und daher zu unerwartetem Verhalten führen kann. Die Verwendung des Optionskontexts in Verbindung mit der with- Anweisung ist die robustere Option und wird auf alles zurückgesetzt, was zuvor festgelegt wurde.
InVader
104

Legen Sie nach dem Importieren von Pandas als Alternative zur Verwendung des Kontextmanagers folgende Optionen für die Anzeige ganzer Datenrahmen fest:

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

Eine vollständige Liste nützlicher Optionen finden Sie unter:

pd.describe_option('display')
Lucidyan
quelle
1
Vielen Dank für das Hinzufügen. "Keine" ist viel besser als die tatsächliche Länge jedes einzelnen Datenrahmens, wenn Sie mehr als einen Datenrahmen anzeigen möchten.
Dremet
5
@ Corrumpo Für einige Optionen sollten Sie -1int Wert anstelle von verwenden None, wenn Sie vollständige Darstellung wünschen
lucidyan
Das Präfixieren display.des Optionsnamens scheint nicht erforderlich zu sein. Funktioniert zum Beispiel set_option('max_columns')genauso gut.
Acumenus
Vielen Dank :)
Orsiris de Jong
45

Verwenden Sie das Tabellenpaket:

pip install tabulate

Betrachten Sie die folgende Beispielverwendung:

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 |
+----+--------------+---------+-------+
Die Unfun Cat
quelle
tabulate geht beim drucken einer pd.Series durcheinander.
Eliu
2
@eliu Danke für die Info. Sie haben immerpd_series.to_frame()
The Unfun Cat
20

Wenn Sie Ipython Notebook (Jupyter) verwenden. Sie können HTML verwenden

from IPython.core.display import HTML
display(HTML(df.to_html()))
R Kisyula
quelle
1
Bitte zeigen Sie die Ausgabe zum Vergleich mit anderen Lösungen, Tnx.
Vwvan
7
Versuchen Sie nicht, damit einen großen Datenrahmen anzuzeigen. Möglicherweise geht Ihnen der Speicher aus und Sie können Ihr Notizbuch nie wieder öffnen, es sei denn, Sie bearbeiten den Rohcode in Ihrer .ipyndb-Datei. Wahre Geschichte;)
FLBKernel
Dies ist die beste Option für mich. Die Tabelle wird vollständig mit Farbe angezeigt. Schön!
Ololade
20

Verwenden von pd.options.display

Diese Antwort ist eine Variation der vorherigen Antwort von Lucidyan . Es macht den Code besser lesbar, indem die Verwendung von vermieden wirdset_option .

Legen Sie nach dem Importieren von Pandas als Alternative zur Verwendung des Kontextmanagers folgende Optionen für die Anzeige großer Datenrahmen fest:

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

Danach können Sie entweder display(df)oder nur dfein Notebook verwenden, andernfalls print(df).

Verwenden von to_string

Pandas 0.25.3 hat DataFrame.to_stringund Series.to_stringMethoden , die Formatierungsoptionen akzeptieren.

Verwenden von to_markdown

Wenn Sie eine Markdown-Ausgabe benötigen, verfügt Pandas 1.0.0 über Methoden DataFrame.to_markdownund Series.to_markdownMethoden.

Verwenden von to_html

Wenn Sie eine HTML-Ausgabe benötigen, verfügt Pandas 0.25.3 über eine DataFrame.to_htmlMethode, jedoch nicht über eine Series.to_html. Beachten Sie, dass ein Serieskann konvertierte zu einer DataFrame.

Scharfsinn
quelle
Ja, dies scheint eine elegantere Möglichkeit für die Anzeige in Jupyter anstelle von set_option zu sein. Gibt es eine Möglichkeit, die angezeigte Ausgabe nach links auszurichten? Die rechten Zeilen des angezeigten Datenrahmens sind standardmäßig rechts ausgerichtet.
Vinsinraw
11

Versuche dies

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)
Liang Zulin
quelle
3

Sie können dies mit der folgenden Methode erreichen. Übergeben Sie einfach die Gesamtzahl. von Spalten, die im DataFrame als arg to vorhanden sind

'display.max_columns'

Zum Beispiel:

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

Versuchen Sie es mit der Funktion display (). Dies würde automatisch horizontale und vertikale Bildlaufleisten verwenden und mit dieser können Sie verschiedene Datensätze einfach anzeigen, anstatt print () zu verwenden.

display(dataframe)

display () unterstützt auch die korrekte Ausrichtung.

Wenn Sie den Datensatz jedoch schöner gestalten möchten, können Sie dies überprüfen pd.option_context() . Es gibt viele Optionen, um den Datenrahmen klar anzuzeigen.

Hinweis - Ich verwende Jupyter-Notizbücher.

Sabari Vishnu Jayanthan J.
quelle