2013-08-30 44 views
32

Come posso stampare un dataframe panda come una bella tabella di testo, come la seguente?Pretty Printing a pandas dataframe

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

Aggiornamento: Ho trovato una soluzione a questo, pubblicato come risposta di seguito.

risposta

12

È possibile utilizzare prettytable per eseguire il rendering della tabella come testo. Il trucco è convertire la data_frame in un file csv in-memory e avere una buona lettura. Ecco il codice:

from StringIO import StringIO 
import prettytable  

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

Quale versione di panda era questa? – WAF

+0

AFAIK, 'prettytable' è in gran parte considerato abandonware. Peccato, perché era un bel pacchetto. :( – dmn

+0

@dmn quindi non viene più mantenuto? – muon

6

Ho usato la risposta di Ofer per un po 'e l'ho trovato ottimo nella maggior parte dei casi. Sfortunatamente, a causa di incongruenze tra pandas's to_csv e prettytable di from_csv, ho dovuto usare prettytable in un modo diverso.

Un caso di fallimento è un dataframe contenente virgole:

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

Prettytable solleva un errore di forma:

Error: Could not determine delimiter 

La seguente funzione gestisce questo caso:

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

Se non ti interessa l'indice, Uso:

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

Salve, la funzione 'format_for_print()' non sembra stampare l'indice di Pandas DataFrame. Ho impostato l'indice usando 'df.index.name = 'index'' ma questo non stampa la colonna indice con un nome: –

58

ho appena trovato un ottimo strumento per quel bisogno, si chiama tabulate.

Stampa dati tabulari e funziona con 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  | 
+----+-----------+-------------+ 

Nota: V'è un open Pull request che permetterà di includere/escludere l'indice.

+4

Se non si ha accesso al bordo sanguinante, si può fare 'tabulate ([lista (riga) per riga in df.values], intestazioni = lista (df.columns)) 'per eliminare l'indice –

+1

Non funziona molto bene quando si hanno le gerarchie nell'indice di riga e nelle colonne. – Siddharth

+0

Assicurati di fare' print (tabulate (df, ** kwargs)) 'e non semplicemente' tabulate (df, ** kwargs) '; quest'ultimo mostrerà tutte le nuove linee' \ n' .... – Dror