Đẹp In khung dữ liệu gấu trúc


113

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

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

Câu trả lời:


180

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

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        |
+----+-----------+-------------+

Ghi chú:

Để loại bỏ các chỉ số hàng cho tất cả các loại dữ liệu, hãy chuyển showindex="never"hoặc showindex=False.


5
Nếu bạn không có quyền truy cập vào mép chảy máu, bạn có thể làm tabulate([list(row) for row in df.values], headers=list(df.columns))để thoát khỏi ứng của Mục lục
Pedro M Duarte

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

Hãy chắc chắn rằng bạn làm print(tabulate(df, **kwargs))và không đơn giản tabulate(df, **kwargs); cái sau sẽ hiển thị tất cả các dòng mới \n....
Dror

6
Để loại bỏ cột chỉ mục bên trái, người ta cũng có thể muốn thêmshowindex=False
Arthur


17

gấu trúc> = 1,0

Nếu bạn muốn một chức năng có sẵn để kết xuất dữ liệu của bạn vào một số đánh dấu github, bây giờ bạn có một chức năng. Hãy xem to_markdown:

df = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=['a', 'a', 'b'])  
print(df.to_markdown()) 

|    |   A |   B |
|:---|----:|----:|
| a  |   1 |   1 |
| a  |   2 |   2 |
| b  |   3 |   3 |

Đây là những gì trông giống như trên github:

nhập mô tả hình ảnh ở đây

Lưu ý rằng bạn vẫn cần phải tabulatecài đặt gói.


16

Nếu bạn đang sử dụng sổ ghi chép Jupyter, bạn có thể chạy mã sau để hiển thị khung dữ liệu một cách tương tác trong một bảng được định dạng tốt.

Câu trả lời này dựa trên câu trả lời to_html ('temp.html') ở trên, nhưng thay vì tạo tệp, hiển thị bảng được định dạng tốt ngay trong sổ ghi chép:

from IPython.display import display, HTML

display(HTML(df.to_html()))

Ghi có cho mã này do ví dụ tại: Hiển thị DataFrame dưới dạng bảng trong iPython Notebook


15

Bạn có thể sử dụng prettytable để hiển thị bảng dưới dạng văn bản. Mẹo là chuyển data_frame thành tệp csv trong bộ nhớ và có thể đọ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

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

4
AFAIK, prettytablephần lớn được coi là phần mềm bỏ rơi. Xấu hổ quá, vì nó là một gói hàng đẹp. :(
dmn

@dmn vì vậy nó không được duy trì nữa?
muon

prettytableđã không có bản phát hành kể từ ngày 6 tháng 4 năm 2013. tabulatelà tiền thân tinh thần của nó và có các bản phát hành thường xuyên, gần đây nhất là vào ngày 24 tháng 1 năm 2019.
gật đầu vào

7

Tôi đã sử dụng câu trả lời của Ofer trong 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ự mâu thuẫn giữa to_csv của gấu trúcfrom_csv của prettytable, tôi đã phải sử dụng prettytable theo một cách khác.

Một trường hợp lỗi là khung dữ liệu có chứa dấu phẩy:

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

Prettytable đưa ra một lỗi của biểu mẫu:

Error: Could not determine delimiter

Hàm 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, hãy 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)

Xin chào, format_for_print()chức năng này dường như không in chỉ mục của Pandas DataFrame. Tôi đặt chỉ mục bằng cách sử dụng df.index.name = 'index'nhưng điều này không in cột chỉ mục có tên.
edesz

2

Tiếp theo câu trả lời của Mark, nếu bạn không sử dụng Jupyter vì lý do nào đó, chẳng hạn như bạn muốn thực hiện một số thử nghiệm nhanh trên bảng điều khiển, bạn có thể sử dụng DataFrame.to_stringphương pháp này, hoạt động từ - ít nhất - Pandas 0.12 (2014) trở đi .

import pandas as pd

matrix = [(1, 23, 45), (789, 1, 23), (45, 678, 90)]
df = pd.DataFrame(matrix, columns=list('abc'))
print(df.to_string())

#  outputs:
#       a    b   c
#  0    1   23  45
#  1  789    1  23
#  2   45  678  90

0

Có thể bạn đang tìm kiếm một cái gì đó như thế này:

def tableize(df):
    if not isinstance(df, pd.DataFrame):
        return
    df_columns = df.columns.tolist() 
    max_len_in_lst = lambda lst: len(sorted(lst, reverse=True, key=len)[0])
    align_center = lambda st, sz: "{0}{1}{0}".format(" "*(1+(sz-len(st))//2), st)[:sz] if len(st) < sz else st
    align_right = lambda st, sz: "{0}{1} ".format(" "*(sz-len(st)-1), st) if len(st) < sz else st
    max_col_len = max_len_in_lst(df_columns)
    max_val_len_for_col = dict([(col, max_len_in_lst(df.iloc[:,idx].astype('str'))) for idx, col in enumerate(df_columns)])
    col_sizes = dict([(col, 2 + max(max_val_len_for_col.get(col, 0), max_col_len)) for col in df_columns])
    build_hline = lambda row: '+'.join(['-' * col_sizes[col] for col in row]).join(['+', '+'])
    build_data = lambda row, align: "|".join([align(str(val), col_sizes[df_columns[idx]]) for idx, val in enumerate(row)]).join(['|', '|'])
    hline = build_hline(df_columns)
    out = [hline, build_data(df_columns, align_center), hline]
    for _, row in df.iterrows():
        out.append(build_data(row.tolist(), align_right))
    out.append(hline)
    return "\n".join(out)


df = pd.DataFrame([[1, 2, 3], [11111, 22, 333]], columns=['a', 'b', 'c'])
print tableize(df)
Đầu ra:
+ ------- + ---- + ----- +
| a | b | c |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +

-5

Tôi muốn có một bản in ra giấy của khung dữ liệu nhưng tôi cũng muốn thêm một số kết quả và nhận xét trên cùng một trang. Tôi đã làm việc thông qua những điều trên và tôi không thể đạt được những gì tôi muốn. Tôi đã kết thúc bằng cách sử dụng các câu lệnh file.write (df1.to_csv ()) và file.write (",,, blah ,,,,,, blah") để đưa các phần bổ sung của tôi trên trang. Khi tôi mở tệp csv, nó chuyển thẳng đến một bảng tính in mọi thứ theo đúng tốc độ và định dạng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.