Khá in toàn bộ Dòng Pandas / DataFrame


654

Tôi làm việc với Series và DataFrames trên thiết bị đầu cuối rất nhiều. Mặc định __repr__cho Sê-ri trả về mẫu đã giảm, với một số giá trị đầu và đuôi, nhưng phần còn lại bị thiếu.

Có cách dựng sẵn nào để in đẹp toàn bộ Series / DataFrame không? Lý tưởng nhất, nó sẽ hỗ trợ căn chỉnh phù hợp, có thể viền giữa các cột và thậm chí có thể mã hóa màu cho các cột khác nhau.


19
Đầu ra giảm là do các tùy chọn mặc định mà bạn có thể thay đổi bằng cách sử dụng pd.set_option('display.max_rows', 1000), ví dụ, màu là một cái gì đó khác, tôi giả sử bạn đang nói về việc tô màu đầu ra repr html. Tôi không nghĩ rằng điều này được xây dựng ở tất cả.
EdChum

2
@EdChum: cảm ơn, tôi biết về điều này display.max_rows, vấn đề là hầu hết thời gian tôi muốn đầu ra bị cắt ngắn. Chỉ đôi khi tôi muốn thấy đầu ra đầy đủ. Tôi có thể đặt tùy chọn thành giá trị rất cao, sử dụng mặc định __repr__, sau đó hoàn nguyên giá trị, nhưng điều đó có vẻ hơi cồng kềnh và tôi cũng có thể viết chức năng in đẹp của riêng mình trong trường hợp đó.
Dun Peal

1
@EdChum: liên quan đến màu sắc - đây là thiết bị đầu cuối màu, vì vậy sẽ rất tuyệt nếu mỗi hàng được in bằng một màu khác nhau, để dễ dàng phân biệt các giá trị với nhau. Pandas hoạt động tốt với ipython, sử dụng các tính năng đầu cuối tiên tiến - bao gồm cả màu sắc - vì vậy tôi đã tự hỏi liệu Pandas có một số khả năng tô màu hay không.
Dun Peal

1
Tôi sử dụng Pandas trong IPython Notebook chứ không phải IPython làm vỏ thiết bị đầu cuối, tôi không thấy bất kỳ tùy chọn set_optionnào hỗ trợ tô màu, nó có thể được thực hiện như một plugin để áp dụng một số định dạng css hoặc đầu ra. Đây là cách duy nhất tôi nghĩ bạn có thể đạt được điều này
EdChum

Câu trả lời:


867

Bạn cũng có thể sử dụng option_context, với một hoặc nhiều tùy chọn:

with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
    print(df)

Điều này sẽ tự động trả lại các tùy chọn cho các giá trị trước đó của họ.

Nếu bạn đang làm việc trên jupyter-notebook, sử dụng display(df)thay vì print(df)sẽ sử dụng logic hiển thị phong phú của jupyter (như vậy) .


2
Cảm ơn bạn! Lưu ý rằng thiết lập các giá trị tối đa để Nonetắt chúng. Sử dụng with pd.option_context()tài liệu tùy chọn những gì đang xảy ra rất rõ ràng và dứt khoát, và làm cho nó rõ ràng như thế nào để đạt được những thay đổi khác trong đầu ra định dạng mà có thể được mong muốn, sử dụng ví dụ như precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, và nhiều nhiều hơn nữa: pandas.pydata.org/pandas -docs / ổn định / tùy
chọn.html

37
Đối với bất cứ ai thắc mắc: khi sử dụng jupyter, hãy sử dụng display(df)thay vìprint(df)
tsvikas

3
3 đại diện ở đây là gì?
Mona Jalal

1
Nếu DataFrame thực sự lớn, có thể tạm thời viết nó dưới dạng .csv và sử dụng trình xem csv nhanh của Jupyter Lab
Dan

Đó là '3' cho display.max_columns phải là 'Không' để đặt tùy chọn đó_context param thành giá trị mặc định của nó. Đã sửa.
Trutane

607

Không cần phải hack cài đặt. Có một cách đơn giản:

print(df.to_string())

1
Bạn có bao nhiêu cột? Tôi đã kiểm tra với 1300 cột và nó hoạt động tốt: từ các kết hợp nhập itertools từ nhập chuỗi ascii_letters df = pd.DataFrame (data = [[0] * 1326], index = [0], Cột = [(a + b) cho a, b trong các kết hợp (ascii_letters, 2)])
Andrey Shokhin

11
Sử dụng with pd.option_context()tài liệu tùy chọn những gì đang xảy ra rõ ràng hơn và rõ ràng, và làm cho nó rõ ràng như thế nào để đạt được những thay đổi khác trong đầu ra định dạng mà có thể được mong muốn, sử dụng ví dụ như precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, và nhiều nhiều hơn nữa: pandas.pydata.org/ pandas-docs / ổn định / tùy
chọn.html

2
Tôi thích các câu trả lời khác bởi vì điều này có vẻ kỳ lạ trong ví dụ của tôi nếu tôi có nhiều cột và màn hình của tôi không đủ rộng để hiển thị chúng. Tên và dữ liệu cột sẽ thực hiện ngắt dòng riêng biệt, vì vậy không dễ để xem dữ liệu nào thuộc về tên cột nào nữa.
Dremet

9
Người hỏi yêu cầu một giải pháp "in đẹp". Đây không phải là nó. Nếu điều này được sử dụng trong Jupyter Notebook, màn hình đẹp tích hợp sẽ hoàn toàn không được sử dụng. Tốt hơn là sử dụng pd.set_option('display.max_rows', None)ngay trước khi in df.
LS

@LS đã thử nghiệm cả pd.set_option ('display.max_rows', none) và df.to_opes () trên máy tính xách tay Jupyter python 3.x và chúng tạo ra cùng một đầu ra khi được in. Nếu câu trả lời ở trên không hoạt động cho các phiên bản trước, thì bây giờ nó đã có.
H Froedge

166

Chắc chắn, nếu điều này xuất hiện nhiều, hãy tạo một chức năng như thế này. Bạn thậm chí có thể định cấu hình để tải mỗi lần bạn khởi động IPython: https://ipython.org/ipython-doc/1/config/overview.html

def print_full(x):
    pd.set_option('display.max_rows', len(x))
    print(x)
    pd.reset_option('display.max_rows')

Đối với màu sắc, việc quá phức tạp với màu sắc nghe có vẻ phản tác dụng với tôi, nhưng tôi đồng ý một cái gì đó như bootstrap.table-striped sẽ rất tuyệt. Bạn luôn có thể tạo một vấn đề để đề xuất tính năng này.


5
Liên kết đã chết. Có lẽ nó nên là ipython.org/ipython-doc/dev/config/intro.html ?
Ostrokach

2
Sẽ thật tuyệt, nếu ai đó, bất cứ ai, thậm chí là tác giả có thể xác minh và sửa chữa liên kết và gắn cờ những bình luận này là lỗi thời.
Aaron Hall

Điều này là xấu, vì nó giả định rằng tùy chọn đã được đặt thành mặc định trước khi thao tác in không nhất thiết phải như vậy và do đó có thể dẫn đến hành vi không mong muốn. Sử dụng bối cảnh tùy chọn kết hợp với câu lệnh with là tùy chọn mạnh mẽ hơn và sẽ trở lại bất kỳ thứ gì đã được đặt trước đó.
inVader

104

Sau khi nhập gấu trúc, thay thế cho việc sử dụng trình quản lý bối cảnh, hãy đặt các tùy chọn như vậy để hiển thị toàn bộ dữ liệu:

pd.set_option('display.max_columns', None)  # or 1000
pd.set_option('display.max_rows', None)  # or 1000
pd.set_option('display.max_colwidth', -1)  # or 199

Để biết danh sách đầy đủ các tùy chọn hữu ích, xem:

pd.describe_option('display')

1
Cảm ơn đã thêm điều này. "Không" là cách tốt hơn chiều dài thực tế của từng khung dữ liệu nếu bạn muốn hiển thị nhiều hơn một khung dữ liệu.
Dremet

5
@Corrumpo Đối với một số tùy chọn, bạn nên sử dụng -1giá trị int thay vì None, nếu bạn muốn đại diện đầy đủ
lucidyan

Tiền tố display.trong tên tùy chọn dường như không cần thiết. Ví dụ, set_option('max_columns')hoạt động tốt như nhau.
Acumenus

Cảm ơn rất nhiều :)
Orsiris de Jong

45

Sử dụng gói lập bảng:

pip install tabulate

Và xem xét cách sử dụng ví dụ sau:

import pandas as pd
from io import StringIO
from tabulate import tabulate

c = """Chromosome Start End
chr1 3 6
chr1 5 7
chr1 8 9"""

df = pd.read_table(StringIO(c), sep="\s+", header=0)

print(tabulate(df, headers='keys', tablefmt='psql'))

+----+--------------+---------+-------+
|    | Chromosome   |   Start |   End |
|----+--------------+---------+-------|
|  0 | chr1         |       3 |     6 |
|  1 | chr1         |       5 |     7 |
|  2 | chr1         |       8 |     9 |
+----+--------------+---------+-------+

lập bảng đi haywire khi in pd.Series.
eliu

2
@eliu Cảm ơn thông tin. Bạn luôn cópd_series.to_frame()
Mèo Unun

20

Nếu bạn đang sử dụng Ipython Notebook (Jupyter). Bạn có thể sử dụng HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))

1
vui lòng hiển thị đầu ra để so sánh với các giải pháp khác, Tnx.
vwvan 16/03/19

7
Coi chừng cố gắng hiển thị một Dataframe lớn với điều này. Bạn có thể hết bộ nhớ và không bao giờ có thể mở lại sổ ghi chép của mình trừ khi bạn chỉnh sửa mã thô trong tệp .ipyndb của mình. Câu chuyện có thật;)
FLBKernel

Đây là lựa chọn tốt nhất cho tôi. Bảng được hiển thị đầy đủ với màu. Đẹp quá
Ololade

20

Sử dụng pd.options.display

Câu trả lời này là một biến thể của câu trả lời trước bởi lucidyan . Nó làm cho mã dễ đọc hơn bằng cách tránh sử dụng set_option.

Sau khi nhập gấu trúc, thay thế cho việc sử dụng trình quản lý bối cảnh, hãy đặt các tùy chọn như vậy để hiển thị các tệp dữ liệu lớn:

def set_pandas_display_options() -> None:
    # Ref: https://stackoverflow.com/a/52432757/
    display = pd.options.display

    display.max_columns = 1000
    display.max_rows = 1000
    display.max_colwidth = 199
    display.width = None
    # display.precision = 2  # set as needed

set_pandas_display_options()

Sau này, bạn có thể sử dụng một trong hai display(df)hoặc chỉ dfkhi sử dụng máy tính xách tay print(df).

Sử dụng to_string

Pandas 0.25.3 không có DataFrame.to_stringSeries.to_stringcác phương thức chấp nhận các tùy chọn định dạng.

Sử dụng to_markdown

Nếu những gì bạn cần là đầu ra markdown, Pandas 1.0.0 có DataFrame.to_markdownSeries.to_markdownphương thức.

Sử dụng to_html

Nếu cái bạn cần là đầu ra HTML, thì Pandas 0.25.3 có một DataFrame.to_htmlphương thức nhưng không phải là a Series.to_html. Lưu ý rằng a Seriescó thể được chuyển đổi thành a DataFrame.


Có, điều này xuất hiện một cách thanh lịch tốt hơn để hiển thị trong Jupyter thay vì set_option. Có cách nào để căn trái đầu ra được hiển thị? Các hàng bên phải của khung dữ liệu được hiển thị được căn phải theo mặc định.
vinsinraw

11

Thử cái này

pd.set_option('display.height',1000)
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)

3

Bạn có thể đạt được điều này bằng phương pháp dưới đây. chỉ cần vượt qua tổng số không. của các cột có trong DataFrame như arg

'display.max_columns'

Ví dụ:

df= DataFrame(..)
with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
    print(df)

-1

Hãy thử sử dụng hàm display (). Điều này sẽ tự động sử dụng các thanh cuộn ngang và dọc và với điều này, bạn có thể dễ dàng hiển thị các bộ dữ liệu khác nhau thay vì sử dụng print ().

display(dataframe)

display () cũng hỗ trợ căn chỉnh phù hợp.

Tuy nhiên nếu bạn muốn làm cho tập dữ liệu đẹp hơn, bạn có thể kiểm tra pd.option_context(). Nó có rất nhiều tùy chọn để hiển thị rõ ràng khung dữ liệu.

Lưu ý - Tôi đang sử dụng Notebook Jupyter.

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.