Imprima uma série inteira de Pandas / DataFrame

654

Eu trabalho muito com Series e DataFrames no terminal. O padrão __repr__para uma série retorna uma amostra reduzida, com alguns valores de cabeça e cauda, ​​mas o restante está ausente.

Existe uma maneira embutida de imprimir bonito todo o Series / DataFrame? Idealmente, ele suportaria o alinhamento adequado, talvez bordas entre colunas e talvez até código de cores para as diferentes colunas.

Dun Peal
fonte
19
A saída reduzida é devido às opções padrão que você pode alterar usando, pd.set_option('display.max_rows', 1000)por exemplo, a coloração é outra coisa, suponho que você esteja falando sobre colorir a saída html repr. Eu não acho que isso esteja embutido.
EdChum 01/10
2
@ EdChum: obrigado, eu sabia disso display.max_rows, o problema é que na maioria das vezes eu quero que a saída seja truncada. É apenas ocasionalmente que desejo ver a saída completa. Eu poderia definir a opção com um valor muito alto, usar o padrão e __repr__, em seguida, reverter o valor, mas isso parece um pouco complicado, e eu também poderia escrever minha própria função de impressão bonita nesse caso.
Dun Peal
1
@ EdChum: em relação às cores - este é um terminal de cores, por isso seria bom ter cada linha impressa em uma cor diferente, para distinguir facilmente valores entre si. O Pandas funciona bem com o ipython, que usa recursos avançados de terminal - incluindo cores -, então eu queria saber se o Pandas tinha alguma capacidade de colorir.
Dun Peal
1
Eu uso o Pandas no IPython Notebook em vez do IPython como um terminal, não vejo nenhuma opção set_optionque suporte a coloração, talvez algo que possa ser feito como um plug-in para aplicar alguma formatação de saída ou css. Esta é a única maneira que eu acho que você poderia conseguir isso
EdChum

Respostas:

867

Você também pode usar o option_context, com uma ou mais opções:

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

Isso retornará automaticamente as opções aos seus valores anteriores.

Se você estiver trabalhando no notebook jupyter, usar em display(df)vez de print(df)usará a lógica de exibição rica do jupyter (assim) .

tsvikas
fonte
2
Obrigado! Observe que definir os valores máximos para Nonedesativá-los. Usando os with pd.option_context()documentos de opções o que está acontecendo de forma muito clara e explicitamente, e deixa claro como alcançar outras mudanças na produção de formatação que pode ser desejada, usando, por exemplo precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, e muitos muitos mais: pandas.pydata.org/pandas -docs / estável / options.html
nealmcb
37
Para quem se pergunta: ao usar o jupyter, use em display(df)vez deprint(df)
tsvikas
3
o que é 3 representando aqui?
Mona Jalal
1
Se a trama de dados é muito grande, pode fazer sentido para escrevê-lo como um arquivo .csv temporariamente e usar visualizador rápido csv de Jupyter Lab
Dan
Esse '3' para display.max_columns deve ser 'None' para definir esse parâmetro option_context como seu valor padrão. Fixo.
Trutane
607

Não há necessidade de hackear configurações. Existe uma maneira simples:

print(df.to_string())
Andrey Shokhin
fonte
1
Quantas colunas você tem? Eu verifiquei com 1300 colunas e ele funciona bem: do itertools importa combinações da string import ascii_letters df = pd.DataFrame (data = [[0] * 1326], índice = [0], colunas = [(a + b) para a, b em combinações (ascii_letters, 2)])
Andrey Shokhin 2/16/16
11
Usando os with pd.option_context()documentos de opção que está acontecendo muito mais clara e explicitamente, e deixa claro como alcançar outras mudanças na produção de formatação que pode ser desejada, usando, por exemplo precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, e muitos muitos mais: pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb
2
Eu prefiro as outras respostas, porque isso parece estranho no meu exemplo, se eu tiver muitas colunas e minha tela não for larga o suficiente para exibi-las. Os nomes e os dados das colunas farão quebras de linha separadas, portanto, não é mais fácil ver quais dados pertencem a qual nome de coluna.
Dremet
9
O solicitante solicitou uma solução de "impressão bonita". Isto é não -lo. Se isso fosse usado no Jupyter Notebook, a bonita tela embutida não seria usada. É melhor usar pd.set_option('display.max_rows', None)logo antes da impressão df.
LS
O @LS testou pd.set_option ('display.max_rows', None) e df.to_string () em um notebook Jupyter python 3.x e eles produziram a mesma saída quando impressos. Se a resposta acima não funcionou para versões anteriores, ela funciona agora.
H Froedge 28/09/19
166

Claro, se isso acontecer muito, faça uma função como esta. Você pode até configurá-lo para carregar sempre que iniciar o 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')

Quanto à coloração, ficar muito elaborado com cores parece contraproducente para mim, mas eu concordo que algo como o bootstrap.table-striped seria bom. Você sempre pode criar um problema para sugerir esse recurso.

Dan Allan
fonte
5
O link está morto. Talvez deva ser ipython.org/ipython-doc/dev/config/intro.html ?
Ostrokach #
2
Seria ótimo se alguém, alguém, até mesmo o autor, pudesse verificar e corrigir o link e sinalizar esses comentários como obsoletos.
Aaron Hall
Isso é ruim, pois pressupõe que a opção foi definida como padrão antes da operação de impressão, o que não é necessariamente o caso e, portanto, pode levar a um comportamento inesperado. Usar o contexto da opção em conjunto com a instrução with é a opção mais robusta e reverterá para qualquer coisa que foi definida anteriormente.
inVader 21/02/19
104

Depois de importar os pandas, como alternativa ao uso do gerenciador de contexto, defina essas opções para exibir quadros de dados inteiros:

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

Para uma lista completa de opções úteis, consulte:

pd.describe_option('display')
lucidyan
fonte
1
Obrigado por adicionar isso. "Nenhum" é muito melhor que o comprimento real de cada quadro de dados único, se você deseja exibir mais de um quadro de dados.
Dremet
5
@Corrumpo Para algumas opções que você deve usar -1o valor int em vez de None, se você quiser plena representação
lucidyan
Prefixar display.o nome da opção não parece ser necessário. Por exemplo, set_option('max_columns')funciona igualmente bem.
Acumenus 20/09/19
Muito obrigado :)
Orsiris de Jong 25/03
45

Use o pacote tabulado:

pip install tabulate

E considere o seguinte exemplo de uso:

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 |
+----+--------------+---------+-------+
The Unfun Cat
fonte
tabular fica inoperante ao imprimir um pd.Series.
22418 eliu
2
@eliu Obrigado pela informação. Você sempre tempd_series.to_frame()
The Unfun Cat
20

Se você estiver usando o Ipython Notebook (Jupyter). Você pode usar HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))
R Kisyula
fonte
1
por favor, mostre a saída para comparação com outras soluções, Tnx.
vwvan
7
Cuidado para tentar mostrar um grande Dataframe com isso. Você pode ficar sem memória e nunca conseguir abrir novamente o bloco de anotações, a menos que edite o código não processado no arquivo .ipyndb. História verdadeira;)
FLBKernel
Esta é a melhor opção para mim. A tabela é exibida na íntegra com cores. Agradável!
Ololade 7/03
20

Usando pd.options.display

Esta resposta é uma variação da resposta anterior de lucidyan . Torna o código mais legível, evitando o uso de set_option.

Depois de importar os pandas, como alternativa ao uso do gerenciador de contexto, defina essas opções para exibir grandes quadros de dados:

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

Depois disso, você pode usar um display(df)ou apenas dfse estiver usando um notebook, caso contrário print(df).

Usando to_string

O Pandas 0.25.3 possui DataFrame.to_stringe Series.to_stringmétodos que aceitam opções de formatação.

Usando to_markdown

Se o que você precisa é uma saída de remarcação, o Pandas 1.0.0 possui DataFrame.to_markdowne Series.to_markdownmétodos.

Usando to_html

Se o que você precisa é de saída HTML, o Pandas 0.25.3 possui um DataFrame.to_htmlmétodo, mas não um Series.to_html. Observe que a Seriespode ser convertido em a DataFrame.

Acumenus
fonte
Sim, isso parece ser uma maneira melhor e elegante de exibir no Jupyter em vez de set_option. Existe uma maneira de alinhar à esquerda a saída exibida? Linhas à direita do quadro de dados exibido são alinhadas à direita por padrão.
vinsinraw 27/02
11

Tente isto

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
fonte
3

Você pode conseguir isso usando o método abaixo. basta passar o total não. de colunas presentes no DataFrame como arg para

'display.max_columns'

Por exemplo:

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

Tente usar a função display (). Isso usaria automaticamente barras de rolagem horizontais e verticais e, com isso, você poderá exibir diferentes conjuntos de dados facilmente, em vez de usar print ().

display(dataframe)

O display () também suporta o alinhamento adequado.

No entanto, se você quiser tornar o conjunto de dados mais bonito, pode verificar pd.option_context(). Tem muitas opções para mostrar claramente o quadro de dados.

Nota - Estou usando os Notebooks Jupyter.

Sabari Vishnu Jayanthan J
fonte