Imprime uma string muito longa completamente no dataframe do pandas


116

Estou lutando com uma coisa aparentemente muito simples. Eu tenho um quadro de dados do pandas contendo uma string muito longa.

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

Agora, quando tento imprimir o mesmo, não vejo a string inteira, prefiro ver apenas uma parte da string.

Eu tentei seguir as opções

  • usando print(df.iloc[2])
  • usando to_html
  • usando to_string
  • Uma das respostas stackoverflow sugeriu aumentar a largura da coluna usando a opção de exibição do pandas, que também não funcionou.
  • Eu também não entendi como set_printoptionsvai me ajudar.

Todas as ideias são apreciadas. Parece muito simples, mas não consigo entender!

Respostas:


176

Você pode usar options.display.max_colwidthpara especificar que deseja ver mais na representação padrão:

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

E, de fato, se você quiser apenas inspecionar um valor, acessando-o (como um escalar, não como uma linha como df.iloc[2]faz), você também verá a string 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] - não funciona - vou imprimir a primeira e a terceira linha e cortada (
Rocketq

Funciona, se você quiser o elemento da terceira linha e da primeira coluna. Se você quiser outra coisa, abra uma nova pergunta.
joris

Funciona, obrigado! Eu tenho uma lista de CEPs em 1 coluna e uso aplicar para encontrar as colunas mínimas e máximas usando uma função: df ['zipcodeMinMax'] = df.loc [:, ['zipcodeList']]. Apply (createMinMaxZipcode, axis = 1). Portanto, dentro da função que faço to_string na série (stringZipcodes = zipcodeList.to_string (header = False, index = False)). As listas mais longas de códigos postais resultaram em 3 pontos no final, por exemplo, "1111 ...". Na verdade, isso não acontece se você selecionar os valores com base no índice e na coluna (como um escalar). Minha pergunta: por que esse comportamento? Definir as opções de exibição para influenciar a aplicação parece estranho para mim? THX!
Wouter de

1
@Wouter se você tiver uma pergunta diferente, é melhor fazer uma nova em vez de comentar aqui
joris

1
Isso não funciona para uma string maior, como um parágrafo com várias linhas.
devssh de

37

Use pd.set_option('display.max_colwidth', -1)para quebras de linha automáticas e células multilinhas.

Este é um ótimo recurso sobre como usar a exibição de jupyters com pandas ao máximo.


6
pd.set_option('display.max_colwidth', None)para versões mais recentes
cookiemonster

Esta é a melhor resposta
clancy

17

Outra abordagem bastante simples é chamar a função de lista:

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

Não vale a pena mencionar, isso não é bom conventar para listar as colunas inteiras, mas para uma linha simples - por que não


1
Se você reduziu seu df com base em alguns critérios de pesquisa e ele está reduzido a uma única linha, isso não funciona. É a maneira mais simples, para as necessidades de depuração de qualquer maneira, e gostaria que funcionasse, mas não sei por que não funciona. Você obtém um "*** KeyError: 0". Estou supondo que tem a ver com ser como um "escalar" quando há apenas um valor.
Starman

A partir de hoje, isso retorna todos os caracteres com uma consulta no df que retorna duas células com 127 caracteres, que estou frustrado em tentar chegar. Se isso ajudar alguém
avirr 01 de

12

Outra maneira mais fácil de imprimir a string inteira é chamar valueso dataframe.

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

print(df.values)

A saída será

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

4

É isso que você pretendia fazer?

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

Basta adicionar a seguinte linha ao seu código antes de imprimir.

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

Você pode simplesmente seguir as etapas a seguir para definir outras opções adicionais,

  • Você pode alterar as opções para o recurso pandas max_columns como segue para exibir mais colunas

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

    (isso permite a exibição de 10 colunas, você pode alterar isso conforme necessário)

  • Assim, você pode alterar o número de linhas que você precisa para exibir como segue para exibir mais linhas

    pd.options.display.max_rows = 999

    (isso permite imprimir 999 linhas por vez)

isso deve funcionar bem

Por favor, consulte o documento para alterar mais opções / configurações para pandas


3

A maneira como geralmente lido com a situação que você descreve é ​​usar o .to_csv()método e escrever para stdout:

import sys

df.to_csv(sys.stdout)

Atualização: agora deve ser possível usar apenas em Nonevez desys.stdout com efeito semelhante!

Isso deve despejar todo o dataframe, incluindo a totalidade de quaisquer strings. Você pode usar os parâmetros to_csv para configurar separadores de coluna, se o índice é impresso, etc. Porém, será menos bonito do que renderizá-lo corretamente.

Eu postei isso originalmente em resposta à pergunta um tanto relacionada em Dados de saída de todas as colunas em um dataframe em pandas


2

Eu criei uma pequena função de utilidade, que funciona bem para mim

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)

Posso alterar o comprimento da largura de acordo com minha exigência, sem definir qualquer opção permanentemente.


1

Se você estiver usando o notebook jupyter, também pode imprimir o dataframe do pandas como uma tabela HTML, que imprimirá strings completas.

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

Resultado

    one
0   one
1   two
2   This is very long string very long string very long string veryvery long string
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.