Imprima una serie completa de Pandas / DataFrame

655

Trabajo mucho con Series y DataFrames en la terminal. El valor por defecto__repr__ para una serie devuelve una muestra reducida, con algunos valores de cabeza y cola, pero falta el resto.

¿Hay alguna forma integrada de imprimir con bonitos toda la serie / marco de datos? Idealmente, sería compatible con la alineación adecuada, tal vez los bordes entre las columnas, y tal vez incluso la codificación de color para las diferentes columnas.

Dun Peal
fuente
19
La salida reducida se debe a las opciones predeterminadas que puede cambiar usando, pd.set_option('display.max_rows', 1000)por ejemplo, el color es otra cosa, supongo que está hablando de colorear la salida html repr. No creo que esto esté integrado en absoluto.
EdChum
2
@EdChum: gracias, sabía sobre esto display.max_rows, el problema es que la mayoría de las veces quiero truncar la salida. Solo ocasionalmente deseo ver la salida completa. Podría establecer la opción en un valor muy alto, usar el valor predeterminado __repr__y luego revertir el valor, pero eso parece un poco engorroso, y también podría escribir mi propia función de impresión bonita en ese caso.
Dun Peal
1
@EdChum: con respecto a los colores: este es un terminal de color, por lo que sería bueno tener cada fila impresa en un color diferente, para distinguir fácilmente los valores entre sí. Pandas funciona bien con ipython, que utiliza funciones avanzadas de terminal, incluido el color, por lo que me preguntaba si Pandas tenía algunas capacidades de coloración.
Dun Peal
1
Utilizo Pandas en IPython Notebook en lugar de IPython como terminal shell, no veo ninguna opción set_optionque admita la coloración, tal vez sea algo que podría hacerse como un complemento para aplicar algunos formatos CSS o de salida. Esta es la única forma en que creo que podría lograr esto
EdChum

Respuestas:

867

También puede usar el option_context, con una o más opciones:

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

Esto devolverá automáticamente las opciones a sus valores anteriores.

Si está trabajando en jupyter-notebook, usar en display(df)lugar de print(df)usará la lógica de pantalla rica de jupyter (así) .

tsvikas
fuente
2
¡Gracias! Tenga en cuenta que establecer los valores máximos para Nonedesactivarlos. El uso de los with pd.option_context()documentos de opciones de lo que está pasando muy clara y explícitamente, y deja claro cómo lograr otros cambios en la producción de formato que puede ser deseable, por ejemplo, utilizando precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, y muchos muchos más: pandas.pydata.org/pandas -docs / stable /
options.html
37
Para cualquiera que se pregunte: cuando use jupyter, use en display(df)lugar deprint(df)
tsvikas
3
¿Qué representa 3 aquí?
Mona Jalal
1
Si el DataFrame es realmente grande, podría tener sentido escribirlo temporalmente como .csv y usar el rápido visor csv de Jupyter Lab
Dan
Ese '3' para display.max_columns debería ser 'None' para establecer ese parámetro de option_context a su valor predeterminado. Fijo.
Trutane
607

No es necesario hackear la configuración. Hay una manera simple:

print(df.to_string())
Andrey Shokhin
fuente
1
¿Cuántas columnas tienes? He comprobado con 1300 columnas y funciona bien: desde itertools, importa combinaciones de cadenas de importación ascii_letters df = pd.DataFrame (data = [[0] * 1326], index = [0], columnas = [(a + b) para a, b en combinaciones (ascii_letters, 2)])
Andrey Shokhin el
11
El uso de los with pd.option_context()documentos de opciones de lo que está pasando mucho más clara y explícitamente, y deja claro cómo lograr otros cambios en la producción de formato que se pueden desear, utilizando por ejemplo precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, y muchos muchos más: pandas.pydata.org/ pandas-docs / stable /
options.html
2
Prefiero las otras respuestas porque esto se ve raro en mi ejemplo si tengo muchas columnas y mi pantalla no es lo suficientemente ancha como para mostrarlas. Los nombres y datos de columna harán saltos de línea separados, por lo que ya no es fácil ver qué datos pertenecen a qué nombre de columna.
Dremet
99
El autor de la pregunta solicitó una solución "bonita". Esto no es Si esto se usara en Jupyter Notebook, la bonita pantalla incorporada no se usaría en absoluto. Es mejor usarlo pd.set_option('display.max_rows', None)justo antes de imprimir df.
LS
@LS probó pd.set_option ('display.max_rows', None) y df.to_string () en una computadora portátil Python 3.x Jupyter, y produjeron el mismo resultado cuando se imprimieron. Si la respuesta anterior no funcionó para versiones anteriores, ahora sí.
H Froedge
166

Claro, si esto surge mucho, haga una función como esta. Incluso puede configurarlo para que se cargue cada vez que inicie 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')

En cuanto a la coloración, ser demasiado elaborado con los colores me suena contraproducente, pero estoy de acuerdo en que algo como bootstrap.table-striped sería bueno. Siempre puede crear un problema para sugerir esta función.

Dan Allan
fuente
55
El enlace está muerto. Tal vez debería ser ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach
2
Sería genial si alguien, cualquiera, incluso el autor, pudiera verificar y corregir el enlace y marcar estos comentarios como obsoletos.
Aaron Hall
Esto es malo, ya que supone que la opción se configuró como predeterminada antes de la operación de impresión, lo cual no es necesariamente el caso y, por lo tanto, podría conducir a un comportamiento inesperado. El uso del contexto de opción junto con la instrucción with es la opción más sólida y volverá a cualquier cosa que se haya configurado anteriormente.
inVader
104

Después de importar pandas, como alternativa al uso del administrador de contexto, configure estas opciones para mostrar marcos de datos completos:

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 obtener una lista completa de opciones útiles, consulte:

pd.describe_option('display')
lucidyan
fuente
1
Gracias por agregar esto. "Ninguno" es mucho mejor que la longitud real de cada marco de datos individual si desea mostrar más de un marco de datos.
Dremet
55
@Corrumpo Para algunas opciones, debe usar el -1valor int en lugar de None, si desea una representación completa
lucidyan
Prefijar display.en el nombre de la opción no parece ser necesario. Por ejemplo, set_option('max_columns')funciona igual de bien.
Acumenus
Muchas gracias :)
Orsiris de Jong
45

Use el paquete tabulado:

pip install tabulate

Y considere el siguiente uso de ejemplo:

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 |
+----+--------------+---------+-------+
El gato no divertido
fuente
tabulate se vuelve loco al imprimir un pd. Serie.
eliu
2
@eliu Gracias por la información. Siempre tienespd_series.to_frame()
The Unfun Cat
20

Si está utilizando Ipython Notebook (Jupyter). Puedes usar HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))
R Kisyula
fuente
1
muestre el resultado para compararlo con otras soluciones, Tnx.
vwvan
77
Tenga cuidado de intentar mostrar un gran Dataframe con esto. Es posible que se quede sin memoria y nunca pueda volver a abrir su computadora portátil a menos que edite el código sin formato en su archivo .ipyndb. True story;)
FLBKernel
Esta es la mejor opción para mí. La tabla se muestra completa con colores. ¡Buena esa!
Ololade
20

Utilizando pd.options.display

Esta respuesta es una variación de la respuesta anterior de lucidyan . Hace que el código sea más legible al evitar el uso deset_option .

Después de importar pandas, como alternativa al uso del administrador de contexto, configure estas opciones para mostrar grandes marcos de datos:

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

Después de esto, puede usar cualquiera display(df)o solo dfsi está usando una computadora portátil, de lo contrario print(df).

Utilizando to_string

Pandas 0.25.3 tiene DataFrame.to_stringy Series.to_stringmétodos que aceptan opciones de formato.

Utilizando to_markdown

Si lo que necesita es un resultado de descuento, Pandas 1.0.0 tiene DataFrame.to_markdowny Series.to_markdownmétodos.

Utilizando to_html

Si lo que necesita es salida HTML, Pandas 0.25.3 tiene un DataFrame.to_htmlmétodo pero no un Series.to_html. Tenga en cuenta que a Seriesse puede convertir a a DataFrame.

Acumenus
fuente
Sí, esto parece una forma mejor y elegante para mostrar en Jupyter en lugar de set_option. ¿Hay alguna manera de alinear a la izquierda la salida mostrada? Las filas derechas del marco de datos mostrado se alinean a la derecha de manera predeterminada.
vinsinraw
11

Prueba esto

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

Puede lograr esto utilizando el siguiente método. solo pasa el total no. de columnas presentes en el DataFrame como arg para

'display.max_columns'

Por ejemplo:

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

Intente usar la función display (). Esto usaría automáticamente barras de desplazamiento horizontal y vertical y con esto puede mostrar diferentes conjuntos de datos fácilmente en lugar de usar print ().

display(dataframe)

display () también admite la alineación adecuada.

Sin embargo, si desea que el conjunto de datos sea más hermoso, puede verificarlo pd.option_context(). Tiene muchas opciones para mostrar claramente el marco de datos.

Nota: estoy usando los cuadernos Jupyter.

Sabari Vishnu Jayanthan J
fuente