Imprimez une série complète de Pandas / DataFrame

655

Je travaille beaucoup avec Series et DataFrames sur le terminal. La valeur __repr__par défaut pour une série renvoie un échantillon réduit, avec quelques valeurs de tête et de queue, mais le reste est manquant.

Existe-t-il un moyen intégré d'imprimer correctement l'ensemble de la série / du DataFrame? Idéalement, il prendrait en charge un alignement correct, peut-être des frontières entre les colonnes, et peut-être même un code couleur pour les différentes colonnes.

Dun Peal
la source
19
La sortie réduite est due aux options par défaut que vous pouvez modifier en utilisant pd.set_option('display.max_rows', 1000)par exemple, la coloration est autre chose, je suppose que vous parlez de colorer la sortie de repr html. Je ne pense pas que cela soit intégré du tout.
EdChum
2
@EdChum: merci, je le savais display.max_rows, le problème est que la plupart du temps je veux que la sortie soit tronquée. Ce n'est qu'occasionnellement que je souhaite voir la sortie complète. Je pourrais définir l'option sur une valeur très élevée, utiliser la valeur par défaut __repr__, puis revenir à la valeur, mais cela semble un peu lourd, et je pourrais aussi bien écrire ma propre fonction jolie impression dans ce cas.
Dun Peal
1
@EdChum: en ce qui concerne les couleurs - il s'agit d'un terminal de couleur, il serait donc intéressant d'avoir chaque ligne imprimée dans une couleur différente, pour distinguer facilement les valeurs les unes des autres. Pandas fonctionne bien avec ipython, qui utilise des fonctionnalités de terminal avancées - y compris la couleur - alors je me demandais si Pandas avait lui-même des capacités de coloration.
Dun Peal
1
J'utilise Pandas dans IPython Notebook plutôt que IPython comme shell de terminal, je ne vois aucune option set_optionqui prend en charge la coloration, c'est peut-être quelque chose qui pourrait être fait en tant que plugin pour appliquer un format CSS ou de sortie. C'est la seule façon, je pense, que vous pourriez y parvenir
EdChum

Réponses:

868

Vous pouvez également utiliser le option_context, avec une ou plusieurs options:

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

Cela ramènera automatiquement les options à leurs valeurs précédentes.

Si vous travaillez sur jupyter-notebook, utiliser display(df)au lieu de print(df)utilisera la logique d'affichage riche jupyter (comme ça) .

tsvikas
la source
2
Je vous remercie! Notez que la définition des valeurs maximales Noneles désactive. À l' aide des with pd.option_context()documents d'option ce qui se passe très clairement et explicitement, et montre clairement comment réaliser d' autres changements dans la production de mise en forme qui peut être souhaité, en utilisant par exemple precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, et beaucoup d'autres: pandas.pydata.org/pandas -docs / stable /
options.html
37
Pour tous ceux qui se demandent: lorsque vous utilisez jupyter, utilisez display(df)plutôtprint(df)
tsvikas
3
que représente 3 ici?
Mona Jalal
1
Si le DataFrame est vraiment volumineux, il peut être judicieux de l'écrire en tant que .csv temporairement et d'utiliser la visionneuse csv rapide de Jupyter Lab
Dan
Ce «3» pour display.max_columns doit être «Aucun» pour définir ce paramètre option_context à sa valeur par défaut. Fixé.
Trutane
607

Pas besoin de pirater les paramètres. Il existe un moyen simple:

print(df.to_string())
Andrey Shokhin
la source
1
Combien de colonnes avez-vous? J'ai vérifié avec 1300 colonnes et cela fonctionne bien: à partir d'itertools, importez des combinaisons à partir de la chaîne import ascii_letters df = pd.DataFrame (data = [[0] * 1326], index = [0], columns = [(a + b) pour a, b dans des combinaisons (ascii_letters, 2)])
Andrey Shokhin
11
À l' aide des with pd.option_context()documents d'option ce qui se passe beaucoup plus clairement et explicitement, et montre clairement comment réaliser d' autres changements dans la production de mise en forme qui peut être souhaité, en utilisant par exemple precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, et beaucoup d'autres: pandas.pydata.org/ pandas-docs / stable /
options.html
2
Je préfère les autres réponses car cela semble bizarre dans mon exemple si j'ai beaucoup de colonnes et que mon écran n'est pas assez large pour les afficher. Les noms de colonne et les données feront des sauts de ligne séparés, il n'est donc pas facile de voir quelles données appartiennent à quel nom de colonne.
Dremet
9
Le demandeur a demandé une solution "jolie impression". Ce n'est pas ça. Si cela était utilisé dans Jupyter Notebook, le joli écran intégré ne serait pas du tout utilisé. Il vaut mieux l'utiliser pd.set_option('display.max_rows', None)juste avant l'impression df.
LS
@LS a testé à la fois pd.set_option ('display.max_rows', None) et df.to_string () sur un ordinateur portable Jupyter python 3.x, et ils ont produit la même sortie lors de l'impression. Si la réponse ci-dessus ne fonctionnait pas pour les versions précédentes, elle le fait maintenant.
H Froedge
166

Bien sûr, si cela revient souvent, créez une fonction comme celle-ci. Vous pouvez même le configurer pour qu'il se charge à chaque démarrage d'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 ce qui concerne la coloration, devenir trop élaboré avec des couleurs me semble contre-productif, mais je conviens que quelque chose comme le bootstrap.table-striped serait bien. Vous pouvez toujours créer un problème pour suggérer cette fonctionnalité.

Dan Allan
la source
5
Le lien est mort. Peut-être que ce devrait être ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach
2
Ce serait formidable si quelqu'un, n'importe qui, même l'auteur peut-être, pouvait vérifier et corriger le lien et signaler ces commentaires comme obsolètes.
Aaron Hall
C'est mauvais, car cela suppose que l'option a été définie par défaut avant l'opération d'impression, ce qui n'est pas nécessairement le cas et peut donc entraîner un comportement inattendu. L'utilisation du contexte d'option en conjonction avec l' instruction with est l'option la plus robuste et reviendra à tout ce qui a été défini auparavant.
inVader
104

Après avoir importé des pandas, au lieu d'utiliser le gestionnaire de contexte, définissez ces options pour afficher des cadres de données entiers:

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

Pour la liste complète des options utiles, voir:

pd.describe_option('display')
lucidyan
la source
1
Merci d'avoir ajouté ceci. "Aucun" est bien meilleur que la longueur réelle de chaque trame de données si vous souhaitez afficher plusieurs trames de données.
Dremet
5
@Corrumpo Pour certaines options, vous devez utiliser la -1valeur int au lieu de None, si vous voulez une représentation complète
lucidyan
Le préfixe display.du nom de l'option ne semble pas nécessaire. Par exemple, set_option('max_columns')fonctionne aussi bien.
Acumenus
Merci beaucoup :)
Orsiris de Jong
45

Utilisez le package tabulé:

pip install tabulate

Et considérez l'exemple d'utilisation suivant:

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 |
+----+--------------+---------+-------+
Le chat unfun
la source
tabulation devient détraqué lors de l'impression d'un pd.Series.
eliu
2
@eliu Merci pour l'info. Vous avez toujourspd_series.to_frame()
The Unfun Cat
20

Si vous utilisez Ipython Notebook (Jupyter). Vous pouvez utiliser HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))
R Kisyula
la source
1
veuillez afficher la sortie pour la comparaison avec d'autres solutions, Tnx.
vwvan
7
Attention à essayer de montrer un gros Dataframe avec ça. Vous risquez de manquer de mémoire et de ne jamais pouvoir rouvrir votre bloc-notes à moins que vous n'éditiez le code brut dans votre fichier .ipyndb. Histoire vraie;)
FLBKernel
C'est la meilleure option pour moi. Le tableau est affiché dans son intégralité avec des couleurs. Joli!
Ololade
20

En utilisant pd.options.display

Cette réponse est une variation de la réponse précédente de lucidyan . Il rend le code plus lisible en évitant l'utilisation de set_option.

Après avoir importé des pandas, au lieu d'utiliser le gestionnaire de contexte, définissez ces options pour afficher des cadres de données volumineux:

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

Après cela, vous pouvez utiliser soit display(df)ou juste dfsi vous utilisez un ordinateur portable, sinon print(df).

En utilisant to_string

Pandas 0.25.3 ne DataFrame.to_stringet des Series.to_stringméthodes qui acceptent les options de formatage.

En utilisant to_markdown

Si ce que vous avez besoin est sortie démarquage, Pandas a 1.0.0 DataFrame.to_markdownet Series.to_markdownméthodes.

En utilisant to_html

Si vous avez besoin d'une sortie HTML, Pandas 0.25.3 a une DataFrame.to_htmlméthode mais pas a Series.to_html. Notez que a Seriespeut être converti en a DataFrame.

Acumenus
la source
Oui, cela apparaît comme une meilleure manière élégante d'afficher dans Jupyter au lieu de set_option. Existe-t-il un moyen d'aligner à gauche la sortie affichée? Les lignes de droite de la trame de données affichée sont alignées à droite par défaut.
vinsinraw
11

Essaye ça

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
la source
3

Vous pouvez y parvenir en utilisant la méthode ci-dessous. il suffit de passer le total non. des colonnes présentes dans le DataFrame comme arg à

'display.max_columns'

Par exemple:

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

Essayez d'utiliser la fonction display (). Cela utiliserait automatiquement les barres de défilement horizontales et verticales et avec cela, vous pouvez afficher facilement différents jeux de données au lieu d'utiliser print ().

display(dataframe)

display () prend également en charge un alignement correct.

Cependant, si vous souhaitez rendre l'ensemble de données plus beau, vous pouvez le vérifier pd.option_context(). Il a beaucoup d'options pour montrer clairement la trame de données.

Remarque - J'utilise Jupyter Notebooks.

Sabari Vishnu Jayanthan J
la source