Imprima una cadena muy larga completamente en pandas dataframe


116

Estoy luchando con algo aparentemente muy simple. Tengo un marco de datos de pandas que contiene una cadena muy larga.

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

Ahora, cuando trato de imprimir lo mismo, no veo la cadena completa, prefiero ver solo una parte de la cadena.

Intenté las siguientes opciones

  • utilizando print(df.iloc[2])
  • utilizando to_html
  • utilizando to_string
  • Una de las respuestas de stackoverflow sugirió aumentar el ancho de la columna usando la opción de visualización de pandas, que tampoco funcionó.
  • Tampoco entendí cómo set_printoptionsme ayudaría.

Cualquier idea apreciada. ¡Parece muy simple, pero no puedo conseguirlo!

Respuestas:


176

Puede usar options.display.max_colwidthpara especificar que desea ver más en la representación predeterminada:

In [2]: df
Out[2]:
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [3]: pd.options.display.max_colwidth
Out[3]: 50

In [4]: pd.options.display.max_colwidth = 100

In [5]: df
Out[5]:
                                                                               one
0                                                                              one
1                                                                              two
2  This is very long string very long string very long string veryvery long string

Y, de hecho, si solo desea inspeccionar el valor único, al acceder a él (como un escalar, no como una fila como lo df.iloc[2]hace) también verá la cadena completa:

In [7]: df.iloc[2,0]    # or df.loc[2,'one']
Out[7]: 'This is very long string very long string very long string veryvery long string'

2
df.iloc [2,0] - no funciona - Imprimiré la primera y tercera fila y
cortaré

Funciona, si desea un elemento de la tercera fila y la primera columna. Si desea algo más, abra una nueva pregunta.
joris

¡Funciona, gracias! Tengo una lista de códigos postales en 1 columna y uso aplicar para encontrar la columna mínima y máxima usando una función: df ['zipcodeMinMax'] = df.loc [:, ['zipcodeList']]. Apply (createMinMaxZipcode, axis = 1). Entonces, dentro de la función hago to_string en la serie (stringZipcodes = zipcodeList.to_string (header = False, index = False)). Las listas más largas de códigos postales dieron como resultado 3 puntos al final, por ejemplo, "1111 ...". De hecho, esto no sucede si selecciona los valores basados ​​en índice y columna (como un escalar). Mi pregunta: ¿por qué este comportamiento? ¿Me parece extraño configurar las opciones de visualización para aplicar influencia? ¡Gracias!
Wouter

1
@Wouter si tiene una pregunta diferente, es mejor hacer una nueva en lugar de comentar aquí
joris

1
Esto no funciona para una cadena más grande como un párrafo con varias líneas.
devssh

37

Úselo pd.set_option('display.max_colwidth', -1)para saltos de línea automáticos y celdas de varias líneas.

Este es un gran recurso sobre cómo usar la pantalla de jupyters con pandas al máximo.


6
pd.set_option('display.max_colwidth', None)para versiones más recientes
cookiemonster

Esta es la mejor respuesta
clancy

17

Otro enfoque bastante simple es llamar a la función de lista:

list(df['one'][2])
# output:
['This is very long string very long string very long string veryvery long string']

No vale la pena mencionar, que no es bueno convencer para enumerar las columnas completas, pero para una línea simple, ¿por qué no?


1
Si ha reducido su df en función de algunos criterios de búsqueda y se reduce a una sola línea, esto no funciona. Es la forma más sencilla, para las necesidades de depuración de todos modos, y desearía que funcionara, pero no sé por qué no. Obtiene un "*** KeyError: 0". Supongo que tiene que ver con ser como un "escalar" cuando solo hay un valor.
Starman

A partir de hoy, esto devuelve todos los caracteres con una consulta en el df que devuelve dos celdas con 127 caracteres, a las que me he sentido frustrado al intentar acceder. Si eso ayuda a alguien
avirr

12

Otra forma más fácil de imprimir toda la cadena es llamar valuesal marco de datos.

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

print(df.values)

La salida será

[['one']
 ['two']
 ['This is very long string very long string very long string veryvery long string']]

4

¿Es esto lo que pretendías hacer?

In [7]: x =  pd.DataFrame({'one' : ['one', 'two', 'This is very long string very long string very long string veryvery long string']})

In [8]: x
Out[8]: 
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [9]: x['one'][2]
Out[9]: 'This is very long string very long string very long string veryvery long string'

4

Simplemente agregue la siguiente línea a su código antes de imprimir.

 pd.options.display.max_colwidth = 90  # set a value as your need

Simplemente puede realizar los siguientes pasos para configurar otras opciones adicionales,

  • Puede cambiar las opciones para la función pandas max_columns de la siguiente manera para mostrar más columnas

    import pandas as pd
    pd.options.display.max_columns = 10

    (esto permite que se muestren 10 columnas, puede cambiar esto según lo necesite)

  • De esa manera, puede cambiar el número de filas que necesita mostrar de la siguiente manera para mostrar más filas

    pd.options.display.max_rows = 999

    (esto permite imprimir 999 filas a la vez)

esto debería funcionar bien

Por favor, consulte el documento para cambiar más opciones / configuraciones para pandas


3

La forma en que a menudo trato la situación que usted describe es usar el .to_csv()método y escribir en stdout:

import sys

df.to_csv(sys.stdout)

Actualización: ¡ahora debería ser posible usarlo en Nonelugar de sys.stdoutcon un efecto similar!

Esto debería volcar todo el marco de datos, incluida la totalidad de las cadenas. Puede usar los parámetros to_csv para configurar separadores de columnas, si el índice se imprime, etc. Sin embargo, será menos bonito que representarlo correctamente.

Publiqué esto originalmente en respuesta a la pregunta algo relacionada en Datos de salida de todas las columnas en un marco de datos en pandas


2

He creado una pequeña función de utilidad, esto funciona bien para mí

def display_text_max_col_width(df, width):
    with pd.option_context('display.max_colwidth', width):
        print(df)

display_text_max_col_width(train_df["Description"], 800)

Puedo cambiar la longitud del ancho según mis requisitos, sin establecer ninguna opción de forma permanente.


1

Si está utilizando un cuaderno jupyter, también puede imprimir el marco de datos de pandas como tabla HTML, que imprimirá cadenas completas.

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

Salida

    one
0   one
1   two
2   This is very long string very long string very long string veryvery long string
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.