Досить роздрукувати всю серію Pandas / DataFrame


650

Я багато працюю з Series та DataFrames на терміналі. За замовчуванням __repr__для Series повертається зменшений зразок із деякими значеннями голови та хвоста, але решта відсутня.

Чи є вбудований спосіб красивого друку всієї серії / DataFrame? В ідеалі він підтримував би правильне вирівнювання, можливо, межі між стовпцями, а можливо, навіть кольорове кодування для різних стовпців.


19
Знижений вихід пояснюється параметрами за замовчуванням, які ви можете змінити, використовуючи, pd.set_option('display.max_rows', 1000)наприклад, забарвлення - це щось інше. Я не думаю, що це взагалі вбудовано.
EdChum

2
@EdChum: дякую, я знав про це display.max_rows, проблема полягає в тому, що більшу частину часу я хочу, щоб результат був усічений. Лише час від часу я хочу побачити повний результат. Я міг би встановити параметр на дуже високе значення, скористатися типом за замовчуванням __repr__, а потім повернути це значення, але це здається трохи громіздким, і я можу в цьому випадку написати свою власну функцію симпатичного друку.
Dun Peal

1
@EdChum: щодо кольорів - це кольоровий термінал, тому було б добре, щоб кожен рядок був надрукований іншим кольором, щоб легко відрізнити значення один від одного. Pandas добре працює з ipython, який використовує розширені функції терміналу - включаючи кольорові - тому мені було цікаво, чи має Pandas якісь можливості фарбування.
Dun Peal

1
Я використовую Pandas в IPython Notebook, а не IPython як термінальну оболонку, я не бачу жодних параметрів, set_optionщо підтримують забарвлення, можливо, це може бути щось, що можна зробити як плагін для застосування певного формату css або виводу. Це єдиний спосіб, на який я думаю, ви могли цього досягти
EdChum

Відповіді:


862

Ви також можете скористатися option_contextодним із декількох варіантів:

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

Це автоматично поверне параметри до попередніх значень.

Якщо ви працюєте над ноутбуком jupyter, display(df)замість того, print(df)щоб використовувати логіку дисплея, розбагатівши юпітером (подібне) .


2
Дякую! Зауважте, що встановлення максимальних значень Noneвимикає їх. Використання with pd.option_context()опціонних документів , що відбувається дуже чітко і ясно, і дає зрозуміти , як досягти інших змін у виході форматування , які можуть бути бажаними, з використанням , наприклад precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, і багато іншого: pandas.pydata.org/pandas -docs / stable / options.html
nealmcb

37
Для всіх, хто задається питанням: при використанні джуптера використовуйте display(df)замістьprint(df)
tsvikas

3
що тут представлено 3?
Мона Джалал

1
Якщо DataFrame дійсно великий, це може мати сенс , щоб написати її як .csv тимчасово і використовувати швидкий переглядач CSV Jupyter ЛАБ
Dan

Це "3" для display.max_column має бути "None", щоб встановити параметр параметра_context своїм значенням за замовчуванням. Виправлено.
Трутан

605

Не потрібно зламати налаштування. Існує простий спосіб:

print(df.to_string())

1
Скільки у вас стовпців? Я перевірив 1300 стовпців, і це працює чудово: з комбінацій імпорту itertools з імпорту рядка ascii_letters df = pd.DataFrame (дані = [[0] * 1326], index = [0], стовпці = [(a + b) для a, b у комбінаціях (ascii_letters, 2)])
Андрій Шохін

11
Використання with pd.option_context()опціонних документів , що відбувається на набагато більш чітко і ясно, і дає зрозуміти , як досягти інших змін у виході форматування , які можуть бути бажані, використовуючи , наприклад precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, і багато іншого: pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb

2
Я віддаю перевагу іншим відповідям, тому що це виглядає дивно в моєму прикладі, якщо у мене є багато стовпців і мій екран недостатньо широкий, щоб їх відображати. Назви стовпців і дані будуть робити окремі розриви рядків, тому не просто зрозуміти, які дані вже належать до назви стовпців.
Дремет

9
Автор запитував рішення про "симпатичний друк". Це не все. Якби це було використано в Jupyter Notebook, вбудований гарний дисплей взагалі не використовувався б. Краще використовувати pd.set_option('display.max_rows', None)безпосередньо перед друком df.
LS

@LS протестував як pd.set_option ('display.max_rows', None), так і df.to_string () на ноутбуці python 3.x Jupyter, і вони отримали однаковий вихід при друкуванні. Якщо вищезгадана відповідь не працювала для попередніх версій, це робить зараз.
H Froedge

166

Впевнені, якщо цього багато виникає, зробіть функцію, подібну до цієї. Ви навіть можете налаштувати його для завантаження кожного разу при запуску 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')

Що стосується фарбування, то занадто досконалі кольори звучать для мене контрпродуктивно, але я погоджуюся, що щось на зразок завантажувального пристрою.table-striped було б добре. Ви завжди можете створити проблему, щоб запропонувати цю функцію.


5
Посилання мертва. Можливо, це має бути ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach

2
Було б чудово, якби хтось, хтось, навіть автор, можливо, міг би перевірити та виправити посилання та позначити ці коментарі як застарілі.
Аарон Холл

Це погано, оскільки передбачає, що параметр був встановлений за замовчуванням перед операцією друку, що не обов'язково має місце і тому може призвести до несподіваної поведінки. Використання контексту опції спільно з оператором with є більш надійним варіантом і повернеться до всього, що було встановлено раніше.
inVader

104

Після імпорту панд як альтернативу використанню менеджера контексту встановіть такі параметри для відображення цілих фреймів даних:

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

Повний список корисних варіантів див:

pd.describe_option('display')

1
Дякуємо, що додали це. "None" набагато краща за фактичну довжину кожного окремого фрейму даних, якщо ви хочете відобразити більше одного фрейму даних.
Дремет

5
@Corrumpo Для деяких варіантів слід використовувати -1значення int замість None, якщо ви хочете повного представлення
lucidyan

Префіксація display.в назві параметра здається не потрібною. Наприклад, set_option('max_columns')працює однаково добре.
Acumenus

Велике спасибі :)
Orsiris de Jong

45

Скористайтеся пакетом таблиць:

pip install tabulate

І розглянемо наступний приклад використання:

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

під час друку pd.Series надходить таблиця.
eliu

2
@eliu Дякую за інформацію У вас завжди єpd_series.to_frame()
The Unfun Cat

20

Якщо ви використовуєте ноутбук Ipython (Юпітер). Ви можете використовувати HTML

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

1
покажіть, будь ласка, вихід для порівняння з іншими рішеннями, Tnx.
vwvan

7
Не забудьте спробувати показати великий Dataframe з цим. Можливо, у вас не вистачить пам’яті, і ви ніколи не зможете знову відкрити свій ноутбук, якщо ви не редагуєте необроблений код у вашому .ipyndb-файлі. Справжня історія;)
FLBKernel

Це найкращий варіант для мене. Таблиця відображається в повному обсязі з розмальовками. Хороший!
Ололада

20

Використання pd.options.display

Ця відповідь є варіацією попередньої відповіді lucidyan . Це робить код більш читабельним, уникаючи використанняset_option .

Після імпорту панд як альтернативу застосуванню менеджера контексту встановіть такі параметри для відображення великих фреймів даних:

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

Після цього ви можете використовувати або display(df)або просто, dfякщо користуєтесь ноутбуком, інакшеprint(df) .

Використання to_string

Панди 0,25,3 мають DataFrame.to_stringіSeries.to_string методи, які приймають параметри форматування.

Використання to_markdown

Якщо вам потрібно - це розмітка результатів, Pandas 1.0.0 має DataFrame.to_markdownіSeries.to_markdown методи.

Використання to_html

Якщо вам потрібен вихід HTML, у Pandas 0.25.3 є DataFrame.to_htmlметод, але не a Series.to_html. Зауважте, що a Seriesможе бути перетворений у DataFrame.


Так, це представляється кращим елегантним способом відображення в Jupyter замість set_option. Чи є спосіб вирівняти відображений висновок ліворуч? Праві рядки відображеного фрейму даних вирівняні за замовчуванням.
vinsinraw

11

Спробуйте це

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

Ви можете досягти цього, використовуючи метод нижче. просто передайте загальну ні. стовпців, представлених у DataFrame як аргумент

'display.max_columns'

Наприклад:

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

-1

Спробуйте скористатися функцією display (). Це автоматично використовує горизонтальні та вертикальні смуги прокрутки, і за допомогою цього ви можете легко відображати різні набори даних замість використання print ().

display(dataframe)

display () також підтримує правильне вирівнювання.

Однак якщо ви хочете зробити набір даних красивішим, ви можете перевірити pd.option_context(). У ньому є безліч варіантів, щоб чітко показати фрейм даних.

Примітка - я використовую ноутбуки Юпітера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.