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.


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í) .


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

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.


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

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

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

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.


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)

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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.