2013-08-30 72 views
32

Làm cách nào để in một khung dữ liệu gấu trúc làm bảng dựa trên văn bản đẹp, như sau?Khá In một khung dữ liệu gấu trúc

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

Cập nhật: Tôi tìm thấy giải pháp cho điều này, được đăng dưới dạng câu trả lời bên dưới.

Trả lời

12

Bạn có thể sử dụng prettytable để hiển thị bảng dưới dạng văn bản. Bí quyết là chuyển đổi data_frame thành tệp csv trong bộ nhớ và có thể đọc được nó. Đây là mã:

from StringIO import StringIO 
import prettytable  

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

Phiên bản gấu trúc này là gì? – WAF

+0

AFAIK, 'prettytable' phần lớn được coi là từ bỏ. Xấu hổ, vì nó là một gói tốt đẹp. :( – dmn

+0

@ dmn để nó không được duy trì nữa? – muon

6

Tôi đã sử dụng câu trả lời của Ofer một thời gian và thấy nó tuyệt vời trong hầu hết các trường hợp. Thật không may, do sự không nhất quán giữa pandas's to_csvprettytable 's from_csv, tôi đã phải sử dụng một cách khác theo cách khác.

Một trường hợp thất bại là một dataframe chứa dấu phẩy:

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

Prettytable đặt ra một lỗi có dạng:

Error: Could not determine delimiter 

Chức năng sau xử lý trường hợp này:

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

Nếu bạn không quan tâm đến chỉ mục, sử dụng:

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

Xin chào, hàm 'format_for_print()' dường như không in chỉ mục của khung dữ liệu Pandas. Tôi đặt chỉ mục bằng cách sử dụng 'df.index.name = 'index'' –

58

Tôi vừa tìm thấy công cụ tuyệt vời cho nhu cầu đó, nó được gọi là tabulate.

Nó in dữ liệu dạng bảng và hoạt động với 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  | 
+----+-----------+-------------+ 

Lưu ý: Có một mở Pull request mà sẽ cho phép để bao gồm/loại trừ các chỉ số.

+4

Nếu bạn không có quyền truy cập vào các cạnh chảy máu, bạn có thể làm 'tabulate ([danh sách (hàng) cho hàng trong df.values], tiêu đề = danh sách (df.columns)) 'để loại bỏ chỉ mục –

+1

Không hoạt động tốt khi bạn có cấu trúc phân cấp trong chỉ mục và cột hàng – Siddharth

+0

Đảm bảo bạn thực hiện' in (tabulate (df, ** kwargs)) 'và không chỉ đơn giản là' tabulate (df, ** kwargs) '; sau này sẽ hiển thị tất cả các dòng mới' \ n' .... – Dror