2013-08-30 95 views
32

如何打印熊貓數據框作爲一個很好的基於文本的表,如下所示?漂亮的打印熊貓數據框

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

更新:我找到了一個解決方案,發佈爲下面的答案。

回答

12

您可以使用prettytable將表格呈現爲文本。訣竅是將data_frame轉換爲內存中的csv文件,並且可讀性良好。這裏是代碼:

from StringIO import StringIO 
import prettytable  

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

這是什麼版本的熊貓? – WAF

+0

AFAIK,'prettytable'主要被認爲是棄用軟件。恥辱,因爲它是一個很好的包。 ( – dmn

+0

@dmn所以它不再被維護? – muon

6

我用了Ofer的答案一段時間,發現它在大多數情況下很好。不幸的是,由於pandas's to_csvprettytable的from_csv不一致,我不得不以不同的方式使用可靠。

一次失敗的情況下是含有數據幀逗號:

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

Prettytable引發形式的誤差:

Error: Could not determine delimiter 

下面的函數處理這種情況下:

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

如果你不關心索引,使用方法:

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

嗨,'format_for_print()'函數似乎不打印熊貓DataFrame的索引。我使用'df.index.name ='index''設置索引但是這不會打印帶有名稱的索引列 –

58

我只是發現對於需要一個偉大的工具,它被稱爲tabulate

它打印表格數據並與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  | 
+----+-----------+-------------+ 

注意:有一個開放的Pull request將允許包括/排除索引。

+4

如果您無法訪問出血邊緣,則可以執行'tabulate([list(row)for df.values],headers = list(df.columns )''擺脫索引 –

+1

當你在行索引和列中有層次結構時,不能很好地工作 – Siddharth

+0

確保你執行'print(tabulate(df,** kwargs))'而不是簡單地'製表( df,** kwargs)';後者將顯示所有新行'\ n' .... – Dror