web-dev-qa-db-fra.com

Pretty Printing a pandas dataframe

Comment puis-je imprimer un fichier de données pandas) sous forme de tableau textuel Nice, comme ci-dessous?

+------------+---------+-------------+
| column_one | col_two |   column_3  |
+------------+---------+-------------+
|          0 |  0.0001 | ABCD        |
|          1 |  1e-005 | ABCD        |
|          2 |  1e-006 | long string |
|          3 |  1e-007 | ABCD        |
+------------+---------+-------------+
72
Ofer

Je viens de trouver un excellent outil pour ce besoin, il s'appelle tabulate .

Il imprime des données tabulaires et fonctionne avec DataFrame.

from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))

+----+-----------+-------------+
|    |   col_two | column_3    |
|----+-----------+-------------|
|  0 |    0.0001 | ABCD        |
|  1 |    1e-05  | ABCD        |
|  2 |    1e-06  | long string |
|  3 |    1e-07  | ABCD        |
+----+-----------+-------------+

Remarque:

Pour supprimer les index de ligne pour tous les types de données, transmettez showindex="never" ou showindex=False.

127
Romain

Vous pouvez utiliser prettytable pour rendre le tableau sous forme de texte. L'astuce consiste à convertir le data_frame en un fichier csv en mémoire et à le faire lire par prettytable. Voici le code:

from StringIO import StringIO
import prettytable    

output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt
15
Ofer

J'ai utilisé la réponse d'Ofer pendant un moment et je l'ai trouvée excellente dans la plupart des cas. Malheureusement, en raison d'incohérences entre from_csv) de --- (pandas's to_csv et prettytable , j'ai dû utiliser prettytable d'une manière différente.

Un cas d'échec est un cadre de données contenant des virgules:

pd.DataFrame({'A': [1, 2], 'B': ['a,', 'b']})

Prettytable pose une erreur de forme:

Error: Could not determine delimiter

La fonction suivante gère ce cas:

def format_for_print(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)

Si vous ne vous souciez pas de l'index, utilisez:

def format_for_print2(df):    
    table = PrettyTable(list(df.columns))
    for row in df.itertuples():
        table.add_row(row[1:])
    return str(table)
7
ejrb

Une approche simple consiste à afficher en HTML, qui les pandas sortent de la boîte :

df.to_html('temp.html')
5
ErichBSchulz

Si vous êtes dans le bloc-notes Jupyter, vous pouvez exécuter le code suivant pour afficher de manière interactive le cadre de données dans un tableau bien formaté.

Cette réponse s'appuie sur la réponse to_html ('temp.html') ci-dessus, mais au lieu de créer un fichier, la table bien formatée s'affiche directement dans le bloc-notes:

from IPython.display import display, HTML

display(HTML(df.to_html()))

Le crédit pour ce code est dû à l'exemple suivant: Afficher la trame DataFrame sous forme de tableau dans le bloc-notes iPython

4
Mark Andersen

Pour donner suite à la réponse de Mark, si vous utilisez pas utilisez Jupyter pour une raison quelconque, par exemple. vous voulez faire des tests rapides sur la console, vous pouvez utiliser le DataFrame.to_string méthode, qui fonctionne à partir de - au moins - Pandas 0.12 (2014).

import pandas as pd

matrix = [(1, 23, 45), (789, 1, 23), (45, 678, 90)]
df = pd.DataFrame(matrix, columns=list('abc'))
print(df.to_string())

#  outputs:
#       a    b   c
#  0    1   23  45
#  1  789    1  23
#  2   45  678  90
1
sigint