Całkiem wydrukuj całą serię Pandas / DataFrame


650

Często pracuję z Series i DataFrames na terminalu. Wartość domyślna __repr__dla Serii zwraca zredukowaną próbkę, z pewnymi wartościami głowy i ogona, ale reszty brakuje.

Czy istnieje wbudowany sposób na ładne wydrukowanie całej Series / DataFrame? Idealnie byłoby wspierać prawidłowe wyrównanie, być może granice między kolumnami, a może nawet kodowanie kolorami dla różnych kolumn.


19
Zmniejszona moc wyjściowa wynika z domyślnych opcji, które można zmienić za pomocą, pd.set_option('display.max_rows', 1000)na przykład, kolorowanie to coś innego, zakładam, że mówisz o kolorowaniu wyjściowego formatu HTML. Nie sądzę, żeby to było w ogóle wbudowane.
EdChum

2
@EdChum: dzięki, wiedziałem o tym display.max_rows, problem polega na tym, że przez większość czasu chcę, aby dane wyjściowe były obcinane. Tylko od czasu do czasu chcę zobaczyć pełną wydajność. Mógłbym ustawić tę opcję na bardzo wysoką wartość, użyć wartości domyślnej __repr__, a następnie cofnąć wartość, ale wydaje się to trochę kłopotliwe i równie dobrze mogę w tym przypadku napisać własną funkcję ładnego drukowania.
Dun Peal

1
@EdChum: w odniesieniu do kolorów - jest to terminal kolorów, więc byłoby dobrze, gdyby każdy wiersz był wydrukowany w innym kolorze, aby łatwo odróżnić wartości od siebie. Pandy dobrze współpracują z ipython, który wykorzystuje zaawansowane funkcje terminala - w tym kolor - więc zastanawiałem się, czy Panda sama ma jakieś możliwości kolorowania.
Dun Peal

1
Używam Pandas w IPython Notebook zamiast IPython jako powłoki terminala, nie widzę żadnych opcji, set_optionktóre obsługują kolorowanie, być może jest to coś, co można zrobić jako wtyczkę, aby zastosować css lub formatowanie wyjściowe. To jedyny sposób, w jaki myślę, że możesz to osiągnąć
EdChum

Odpowiedzi:


862

Możesz także użyć opcji option_context, z jedną lub więcej opcji:

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

Spowoduje to automatyczne przywrócenie opcji do ich poprzednich wartości.

Jeśli pracujesz na jupyter-notebook, użycie display(df)zamiast print(df)spowoduje użycie logiki wyświetlania bogatej w jupyter (podobnie jak) .


2
Dziękuję Ci! Pamiętaj, że ustawienie maksymalnych wartości Nonepowoduje ich wyłączenie. Korzystanie z with pd.option_context()dokumentów opcji, co dzieje się bardzo jasno i wyraźnie, i wyjaśnia, w jaki sposób osiągnąć inne zmiany formatowania wyjścia, które mogą być potrzebne, stosując np precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, i wiele wiele więcej: pandas.pydata.org/pandas -docs / stable / options.html
nealmcb

37
Dla każdego, kto zastanawia się: używając jupyter, użyj display(df)zamiastprint(df)
tsvikas

3
co tu 3 reprezentuje?
Mona Jalal,

1
Jeśli DataFrame jest naprawdę duży, warto tymczasowo napisać go jako .csv i użyć szybkiej przeglądarki csv Jupyter Lab
Dan.

To „3” dla display.max_columns powinno być „None”, aby ustawić parametr parametr_kontekst na jego wartość domyślną. Naprawiony.
Trutane

605

Nie trzeba hakować ustawień. Istnieje prosty sposób:

print(df.to_string())

1
Ile masz kolumn? Sprawdziłem z 1300 kolumnami i działa dobrze: z itertools importuj kombinacje z importu ciągów ascii_letters df = pd.DataFrame (dane = [[0] * 1326], indeks = [0], kolumny = [(a + b)) dla a, b w kombinacjach (ascii_letters, 2)])
Andrey Shokhin

11
Korzystanie z with pd.option_context()dokumentów opcji, co dzieje się dużo bardziej jasno i wyraźnie, i wyjaśnia, w jaki sposób osiągnąć inne zmiany formatowania wyjścia, które mogą być potrzebne, za pomocą np precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, i wiele wiele więcej: pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb

2
Wolę inne odpowiedzi, ponieważ w moim przykładzie wygląda to dziwnie, jeśli mam dużo kolumn, a mój ekran nie jest wystarczająco szeroki, aby je wyświetlić. Nazwy kolumn i dane będą tworzyć osobne podziały wierszy, więc nie jest łatwo zobaczyć, które dane należą do której nazwy kolumny.
Dremet

9
Pytający poprosił o rozwiązanie „ładnego wydruku”. To nie to. Gdyby zostało to zastosowane w Jupyter Notebook, wbudowany ładny wyświetlacz nie byłby w ogóle używany. Lepiej używać pd.set_option('display.max_rows', None)tuż przed drukowaniem df.
LS

@LS przetestował zarówno opcję pd.set_option ('display.max_rows', None), jak i df.to_string () na notebooku Jupyter w Pythonie 3.x, i wydrukowały te same dane wyjściowe. Jeśli powyższa odpowiedź nie działała w poprzednich wersjach, działa teraz.
H Froedge,

166

Jasne, jeśli to się często pojawia, utwórz taką funkcję. Możesz go nawet skonfigurować tak, aby ładował się przy każdym uruchomieniu 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')

Jeśli chodzi o kolorowanie, zbyt rozbudowane kolory brzmią dla mnie bezproduktywnie, ale zgadzam się, że coś w stylu bootstrapu.table-striped byłoby fajne. Zawsze możesz utworzyć problem, aby zasugerować tę funkcję.


5
Link jest martwy. Być może powinien to być ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach

2
Byłoby wspaniale, gdyby ktoś, ktokolwiek, może nawet autor, mógł zweryfikować i naprawić link oraz oznaczyć te komentarze jako przestarzałe.
Aaron Hall

Jest to złe, ponieważ zakłada, że ​​opcja została ustawiona na domyślną przed operacją drukowania, co niekoniecznie ma miejsce i dlatego może prowadzić do nieoczekiwanego zachowania. Używanie kontekstu opcji w połączeniu z instrukcją with jest bardziej niezawodną opcją i spowoduje powrót do wszystkiego, co zostało ustawione wcześniej.
inVader

104

Po zaimportowaniu pand jako alternatywy dla korzystania z menedżera kontekstu ustaw takie opcje wyświetlania całych ramek danych:

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

Aby uzyskać pełną listę przydatnych opcji, zobacz:

pd.describe_option('display')

1
Dzięki za dodanie tego. „Brak” jest o wiele lepszy niż rzeczywista długość każdej pojedynczej ramki danych, jeśli chcesz wyświetlić więcej niż jedną ramkę danych.
Dremet

5
@Corrumpo W przypadku niektórych opcji należy użyć -1wartości int zamiast None, jeśli chcesz uzyskać pełną reprezentację
lucidyan

Prefiks display.w nazwie opcji nie wydaje się konieczny. Na przykład set_option('max_columns')działa równie dobrze.
Acumenus,


45

Skorzystaj z pakietu tabelarycznego:

pip install tabulate

I rozważ następujący przykład użycia:

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 |
+----+--------------+---------+-------+

podczas drukowania pd.Series tabuluje szaleństwo.
eliu

2
@eliu Dzięki za informację. Zawsze maszpd_series.to_frame()
The Unfun Cat

20

Jeśli używasz Ipython Notebook (Jupyter). Możesz użyć HTML

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

1
pokaż wyniki w celu porównania z innymi rozwiązaniami, Tnx.
vwvan

7
Uważaj, aby przy tym pokazać dużą ramkę danych. Być może zabraknie Ci pamięci i nigdy nie będziesz mógł ponownie otworzyć swojego notebooka, dopóki nie edytujesz surowego kodu w pliku .ipyndb. Prawdziwa historia;)
FLBKernel

To dla mnie najlepsza opcja. Tabela jest wyświetlana w całości z kolorem. Niezłe!
Ololade

20

Za pomocą pd.options.display

Ta odpowiedź jest odmianą wcześniejszej odpowiedzi Lucidyana . Sprawia, że ​​kod jest bardziej czytelny dzięki unikaniu użycia set_option.

Po zaimportowaniu pand jako alternatywy dla korzystania z menedżera kontekstu ustaw takie opcje wyświetlania dużych ramek danych:

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

Następnie możesz użyć jednego display(df)lub tylko dfjednego notebooka, w przeciwnym razie print(df).

Za pomocą to_string

Panda 0.25.3 ma DataFrame.to_stringi Series.to_stringmetody, które akceptują opcje formatowania.

Za pomocą to_markdown

Jeśli potrzebujesz wyników wyprzedaży, Pandas 1.0.0 ma DataFrame.to_markdowni Series.to_markdownmetody.

Za pomocą to_html

Jeśli potrzebujesz danych wyjściowych HTML, Pandas 0.25.3 ma DataFrame.to_htmlmetodę, ale nie Series.to_html. Zauważ, że a Seriesmożna przekształcić w a DataFrame.


Tak, wydaje się, że jest to bardziej elegancki sposób wyświetlania w Jupyter zamiast set_option. Czy istnieje sposób wyrównania wyświetlanego wyjścia w lewo? Prawe rzędy wyświetlanej ramki danych są domyślnie wyrównane do prawej.
vinsinraw

11

Spróbuj tego

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

Możesz to osiągnąć za pomocą poniższej metody. wystarczy przekazać łączną liczbę nie. kolumn obecnych w DataFrame jako arg

„display.max_columns”

Na przykład:

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

-1

Spróbuj użyć funkcji display (). Spowodowałoby to automatyczne użycie poziomych i pionowych pasków przewijania, dzięki czemu można łatwo wyświetlać różne zestawy danych zamiast drukowania ().

display(dataframe)

display () obsługuje również prawidłowe wyrównanie.

Jeśli jednak chcesz, aby zestaw danych był piękniejszy, możesz to sprawdzić pd.option_context(). Ma wiele opcji, aby wyraźnie pokazać ramkę danych.

Uwaga - używam notesów Jupyter.

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.