Imprimez complètement une très longue chaîne dans le cadre de données pandas


116

J'ai du mal avec la chose apparemment très simple: j'ai une trame de données pandas contenant une très longue chaîne.

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

Maintenant, quand j'essaie d'imprimer la même chose, je ne vois pas la chaîne complète, je ne vois plutôt qu'une partie de la chaîne.

J'ai essayé les options suivantes

  • en utilisant print(df.iloc[2])
  • en utilisant to_html
  • en utilisant to_string
  • L'une des réponses de stackoverflow a suggéré d'augmenter la largeur de la colonne en utilisant l'option d'affichage pandas, qui ne fonctionnait pas non plus.
  • Je n'ai pas non plus compris comment set_printoptionsva m'aider.

Toutes les idées appréciées. Ça a l'air très simple, mais pas en mesure de l'obtenir!

Réponses:


176

Vous pouvez utiliser options.display.max_colwidthpour spécifier que vous souhaitez en voir plus dans la représentation par défaut:

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

Et en effet, si vous souhaitez simplement inspecter la valeur unique, en y accédant (en tant que scalaire, pas en tant que ligne comme le df.iloc[2]fait), vous voyez également la chaîne complète:

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] - ne fonctionne pas - Je vais imprimer la première et la troisième rangée et couper (
Rocketq

Cela fonctionne, si vous voulez un élément de la troisième ligne et de la première colonne. Si vous voulez autre chose, veuillez ouvrir une nouvelle question.
joris

Cela fonctionne, merci! J'ai une liste de codes postaux dans 1 colonne et j'utilise apply pour trouver les colonnes min et max en utilisant une fonction: df ['zipcodeMinMax'] = df.loc [:, ['zipcodeList']]. Apply (createMinMaxZipcode, axis = 1). Donc, dans la fonction, je fais to_string sur la série (stringZipcodes = zipcodeList.to_string (header = False, index = False)). Les listes plus longues de codes postaux ont abouti à 3 points à la fin, par exemple "1111 ...". En effet, cela ne se produit pas si vous sélectionnez les valeurs basées sur l'index et la colonne (comme un scalaire). Ma question: pourquoi ce comportement? Définir les options d'affichage pour appliquer une influence me semble étrange? THX!
Wouter

1
@Wouter si vous avez une autre question, mieux vaut en poser une nouvelle au lieu de commenter ici
joris

1
Cela ne fonctionne pas pour une chaîne plus grande comme un paragraphe avec plusieurs lignes.
devssh

37

À utiliser pd.set_option('display.max_colwidth', -1)pour les sauts de ligne automatiques et les cellules multilignes.

Ceci est une excellente ressource sur la façon d'utiliser au maximum l'affichage des jupyters avec les pandas.


6
pd.set_option('display.max_colwidth', None)pour les versions plus récentes
cookiemonster le

C'est la meilleure réponse
clancy le

17

Une autre approche assez simple consiste à appeler la fonction de liste:

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

Cela ne vaut pas la peine de mentionner, ce n'est pas bon au couvent de lister toutes les colonnes, mais pour une simple ligne - pourquoi pas


1
Si vous avez réduit votre df en fonction de certains critères de recherche et que cela se résume à une seule ligne, cela ne fonctionne pas. C'est le moyen le plus simple, pour les besoins de débogage de toute façon, et j'aimerais que cela fonctionne, mais je ne sais pas pourquoi cela ne fonctionne pas. Vous obtenez un "*** KeyError: 0". Je suppose que cela a à voir avec le fait d'être comme un "scalaire" quand il n'y a qu'une seule valeur.
Starman

À partir d'aujourd'hui, cela renvoie tous les caractères avec une requête dans le df qui renvoie deux cellules de 127 caractères, ce que j'ai été frustré d'essayer d'atteindre. Si cela aide quelqu'un
avirr

12

Un autre moyen plus simple d'imprimer la chaîne entière est d'appeler valuesle dataframe.

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

print(df.values)

La sortie sera

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

4

Est-ce ce que vous vouliez faire?

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

Ajoutez simplement la ligne suivante à votre code avant de l'imprimer.

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

Vous pouvez simplement suivre les étapes suivantes pour définir d'autres options supplémentaires,

  • Vous pouvez modifier les options de la fonctionnalité pandas max_columns comme suit pour afficher plus de colonnes

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

    (cela permet d'afficher 10 colonnes, vous pouvez changer cela selon vos besoins)

  • Comme ça, vous pouvez modifier le nombre de lignes car vous devez afficher comme suit pour afficher plus de lignes

    pd.options.display.max_rows = 999

    (cela permet d'imprimer 999 lignes à la fois)

cela devrait bien fonctionner

Veuillez consulter le document pour modifier plus d'options / paramètres pour les pandas


3

La façon dont je gère souvent la situation que vous décrivez est d'utiliser la .to_csv()méthode et d'écrire dans stdout:

import sys

df.to_csv(sys.stdout)

Mise à jour: il devrait maintenant être possible d'utiliser simplement Noneau lieu de sys.stdoutavec un effet similaire!

Cela devrait vider l'ensemble de la trame de données, y compris l'intégralité de toutes les chaînes. Vous pouvez utiliser les paramètres to_csv pour configurer les séparateurs de colonnes, si l'index est imprimé, etc. Ce sera cependant moins joli que de le rendre correctement.

J'ai posté ceci à l'origine en réponse à la question quelque peu liée à la sortie des données de toutes les colonnes d'un dataframe dans pandas


2

J'ai créé une petite fonction utilitaire, cela fonctionne bien pour moi

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)

Je peux changer la longueur de la largeur selon mes besoins, sans définir aucune option de manière permanente.


1

Si vous utilisez jupyter notebook, vous pouvez également imprimer le dataframe pandas sous forme de tableau HTML, qui imprimera des chaînes complètes.

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

Production

    one
0   one
1   two
2   This is very long string very long string very long string veryvery long string
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.