2013-08-30 67 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