2013-08-30 10 views
32

Wie kann ich einen Pandas Dataframe als eine nette textbasierte Tabelle, wie folgt drucken?Pretty Drucken eines Pandas Datenrahmens

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

Update: Ich habe eine Lösung gefunden, als Antwort unten geschrieben.

Antwort

12

Sie können prettytable verwenden, um die Tabelle als Text darzustellen. Der Trick besteht darin, den Datenrahmen in eine In-Memory-CSV-Datei zu konvertieren und ihn dann in PrettyTable lesen zu lassen. Hier ist der Code:

+0

Welche Version von Pandas war das? – WAF

+0

AFAIK, 'prettytable' wird weitgehend als Abandonware bezeichnet. Schade auch, wie es ein schönes Paket war. :( – dmn

+0

@ dmn, so dass es nicht mehr gepflegt wird? – muon

6

Ich habe Ofer's Antwort für eine Weile und fand es in den meisten Fällen toll. Leider musste ich wegen der Inkonsistenzen zwischen pandas's to_csv und prettytable von from_csv, prettytable anders verwenden.

Ein Fehlerfall ist ein Datenrahmen enthält Komma:

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

Pretty löst einen Fehler in der Form:

Error: Could not determine delimiter 

Die folgende Funktion übernimmt diesen Fall:

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

Wenn Ihnen der Index egal ist, Verwendung:

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

Hallo, die 'format_for_print() 'Funktion scheint nicht den Index des Pandas DataFrame zu drucken. Ich setze den Index mit' df.index.name = 'index'' aber das druckt die Indexspalte nicht mit einem Namen –

58

Ich habe gerade ein großes Werkzeug für die Notwendigkeit gefunden wird, wird es tabulate genannt.

Es druckt tabellarische Daten und arbeitet mit 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  | 
+----+-----------+-------------+ 

Hinweis: Es gibt eine offene Pull request, die den Index erlauben auf/Ausschluss.

+4

Wenn Sie nicht auf die blutende Kante Zugriff haben, können Sie 'tabulate ([list (row) für Zeile in df.values], headers = list (df.columns)) ', um den Index loszuwerden –

+1

Funktioniert nicht sehr gut, wenn Sie Hierarchien in Zeilenindex und Spalten haben – Siddharth

+0

Stellen Sie sicher, dass Sie' print (tabulate (df, ** kwargs)) 'und nicht einfach' tabulate (df, ** kwargs) '; letzteres zeigt alle neuen Zeilen' \ n' .... – Dror

Verwandte Themen