Довольно распечатать всю серию Pandas / DataFrame

655

Я много работаю с Series и DataFrames на терминале. По умолчанию __repr__для серии возвращается уменьшенная выборка с некоторыми значениями головы и хвоста, но остальные отсутствуют.

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

Дун Пил
источник
19
Сокращенный вывод обусловлен параметрами по умолчанию, которые вы можете изменить, pd.set_option('display.max_rows', 1000)например, используя раскраску, я предполагаю, что вы говорите о раскраске вывода html repr. Я не думаю, что это встроено вообще.
EdChum
2
@EdChum: спасибо, я знал об этом display.max_rows, проблема в том, что большую часть времени я хочу, чтобы вывод был обрезан. Это только изредка, что я хочу увидеть полный вывод. Я мог бы установить опцию на очень высокое значение, использовать значение по умолчанию __repr__, а затем вернуть значение, но это кажется немного громоздким, и я мог бы также написать свою собственную функцию pretty-print в этом случае.
Дан Пил
1
@EdChum: в отношении цветов - это цветовой терминал, поэтому было бы неплохо, чтобы каждая строка была напечатана другим цветом, чтобы легко отличать значения друг от друга. Pandas хорошо работает с ipython, который использует расширенные функции терминала - включая цвет - поэтому мне было интересно, есть ли у Pandas некоторые возможности по окраске.
Дан Пил
1
Я использую Pandas в IPython Notebook, а не IPython в качестве оболочки терминала, я не вижу никаких опций set_option, поддерживающих раскраску, это может быть что-то, что можно сделать как плагин для применения некоторого CSS или выходного форматирования. Это единственный способ, которым я думаю, что вы могли бы достичь этого
EdChum

Ответы:

868

Вы также можете использовать option_contextодин или несколько параметров:

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

Это автоматически вернет параметры к их предыдущим значениям.

Если вы работаете с jupyter-notebook, display(df)вместо него print(df)будет использоваться логика отображения, богатая jupyter (например, так) .

tsvikas
источник
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
Для тех, кто задается вопросом: при использовании jupyter используйте display(df)вместоprint(df)
tsvikas
3
что 3 представляет здесь?
Мона Джалал
1
Если DataFrame действительно большой, возможно, имеет смысл временно записать его в формате .csv и использовать быстрый просмотрщик csv от Jupyter Lab
Дан,
Значение '3' для display.max_columns должно быть 'Нет', чтобы установить для этого параметра option_context значение по умолчанию. Исправлена.
Trutane
607

Не нужно взламывать настройки. Есть простой способ:

print(df.to_string())
Андрей Шохин
источник
1
Сколько у вас столбцов? Я проверил с 1300 столбцами, и он отлично работает: из itertools импортировать комбинации из строки import ascii_letters df = pd.DataFrame (data = [[0] * 1326], index = [0], columns = [(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
Я предпочитаю другие ответы, потому что это выглядит странно в моем примере, если у меня много столбцов и мой экран недостаточно широк, чтобы их отобразить. Имена столбцов и данные будут делать разрывы строк, поэтому не так просто увидеть, какие данные принадлежат какому имени столбца.
Dremet
9
Аскер попросил решение "pretty-print". Это не так. Если бы это использовалось в 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 ?
Острокач
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')
lucidyan
источник
1
Спасибо за добавление этого. «Нет» намного лучше, чем фактическая длина каждого отдельного кадра данных, если вы хотите отобразить более одного кадра данных.
Dremet
5
@Corrumpo Для некоторых опций вы должны использовать -1значение int вместо None, если вы хотите полное представление
lucidyan
Префикс display.в имени опции не требуется. Например, set_option('max_columns')работает одинаково хорошо.
Acumenus
Большое спасибо :)
Орсирис де Йонг
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 Nonun Cat
20

Если вы используете Ipython Notebook (Jupyter). Вы можете использовать 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метод, но нет Series.to_html. Обратите внимание, что 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(). У этого есть много вариантов, чтобы ясно показать кадр данных.

Примечание - я использую ноутбуки Jupyter.

Сабари Вишну Джаянтан Дж
источник