Cukup cetak seluruh Seri Panda / DataFrame

654

Saya sering bekerja dengan Series dan DataFrames di terminal. Default __repr__untuk Seri mengembalikan sampel yang dikurangi, dengan beberapa nilai kepala dan ekor, tetapi sisanya hilang.

Apakah ada cara bawaan untuk cukup mencetak seluruh Seri / DataFrame? Idealnya, itu akan mendukung perataan yang tepat, mungkin berbatasan antara kolom, dan bahkan mungkin kode warna untuk kolom yang berbeda.

Dun Peal
sumber
19
Pengurangan output disebabkan oleh opsi-opsi default yang dapat Anda ubah menggunakan pd.set_option('display.max_rows', 1000)misalnya, pewarnaan adalah sesuatu yang lain, saya berasumsi Anda berbicara tentang mewarnai output html repr. Saya tidak berpikir ini dibangun sama sekali.
EdChum
2
@ EdChum: terima kasih, saya tahu tentang ini display.max_rows, masalahnya adalah bahwa sebagian besar waktu saya ingin keluaran dipotong. Hanya sesekali saya ingin melihat hasil lengkapnya. Saya bisa mengatur opsi ke nilai yang sangat tinggi, menggunakan default __repr__, lalu mengembalikan nilainya, tapi itu agak rumit, dan saya mungkin juga menulis fungsi cantik-cetak saya sendiri dalam kasus itu.
Dun Peal
1
@ EdChum: mengenai warna - ini adalah terminal warna, jadi alangkah baiknya jika setiap baris dicetak dalam warna yang berbeda, untuk dengan mudah membedakan nilai satu sama lain. Panda bekerja dengan baik dengan ipython, yang menggunakan fitur terminal canggih - termasuk warna - jadi saya bertanya-tanya apakah Pandas memiliki beberapa kemampuan pewarnaan itu sendiri.
Dun Peal
1
Saya menggunakan Panda di IPython Notebook daripada IPython sebagai terminal shell, saya tidak melihat opsi apa pun set_optionyang mendukung pewarnaan, itu mungkin sesuatu yang bisa dilakukan sebagai plugin untuk menerapkan beberapa css atau format output. Ini adalah satu-satunya cara saya pikir Anda bisa mencapai ini
EdChum

Jawaban:

867

Anda juga dapat menggunakan option_context, dengan satu opsi atau lebih:

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

Ini akan secara otomatis mengembalikan opsi ke nilai sebelumnya.

Jika Anda bekerja pada jupyter-notebook, menggunakan display(df)bukannya print(df)akan menggunakan logika tampilan kaya jupyter (seperti itu) .

tsvikas
sumber
2
Terima kasih! Perhatikan bahwa pengaturan nilai maks untuk Nonemematikannya. Menggunakan with pd.option_context()dokumen opsi apa yang terjadi sangat jelas dan eksplisit, dan membuat itu jelas bagaimana untuk mencapai perubahan lain dalam output format yang mungkin diinginkan, misalnya menggunakan precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, dan banyak banyak lagi: pandas.pydata.org/pandas -docs / stable / options.html
nealmcb
37
Bagi siapa saja yang bertanya-tanya: saat menggunakan jupyter, gunakan display(df)sebagai gantiprint(df)
tsvikas
3
apa yang mewakili 3 di sini?
Mona Jalal
1
Jika DataFrame benar-benar besar, mungkin masuk akal untuk menuliskannya sebagai .csv sementara dan menggunakan penampil csv cepat Jupyter Lab
Dan
'3' itu untuk display.max_columns harus 'Tidak Ada' untuk mengatur param option_context ke nilai defaultnya. Tetap.
Trutane
607

Tidak perlu meretas pengaturan. Ada cara sederhana:

print(df.to_string())
Andrey Shokhin
sumber
1
Berapa kolom yang Anda miliki? Saya telah memeriksa 1300 kolom dan berfungsi dengan baik: dari itertools kombinasi impor dari impor string ascii_letters df = pd.DataFrame (data = [[0] * 1326], indeks = [0], kolom = [(a + b) untuk a, b dalam kombinasi (ascii_letters, 2)])
Andrey Shokhin
11
Menggunakan with pd.option_context()dokumen opsi apa yang terjadi jauh lebih jelas dan eksplisit, dan membuat itu jelas bagaimana untuk mencapai perubahan lain dalam output format yang mungkin diinginkan, misalnya menggunakan precision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encoding, dan banyak banyak lagi: pandas.pydata.org/ panda-docs / stable / options.html
nealmcb
2
Saya lebih suka jawaban lain karena ini terlihat aneh dalam contoh saya jika saya memiliki banyak kolom dan layar saya tidak cukup lebar untuk menampilkannya. Nama kolom dan data akan melakukan jeda baris terpisah, sehingga tidak mudah untuk melihat data mana yang menjadi milik nama kolom lagi.
Dremet
9
Penanya meminta solusi "cetak cantik". Ini bukan itu. Jika ini digunakan dalam Jupyter Notebook, tampilan cantik bawaan tidak akan digunakan sama sekali. Lebih baik digunakan pd.set_option('display.max_rows', None)sesaat sebelum mencetak df.
LS
@ LS menguji pd.set_option ('display.max_rows', None) dan df.to_string () pada python 3.x Jupyter notebook, dan mereka menghasilkan output yang sama ketika dicetak. Jika jawaban di atas tidak berfungsi untuk versi sebelumnya, itu sekarang.
H Froedge
166

Tentu, jika ini banyak muncul, buat fungsi seperti ini. Anda bahkan dapat mengonfigurasinya untuk memuat setiap kali Anda memulai 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')

Sedangkan untuk mewarnai, terlalu rumit dengan warna-warna terdengar kontraproduktif bagi saya, tapi saya setuju sesuatu seperti bootstrap.table-striped akan menyenangkan. Anda selalu dapat membuat masalah untuk menyarankan fitur ini.

Dan Allan
sumber
5
Tautannya sudah mati. Mungkin seharusnya ipython.org/ipython-doc/dev/config/intro.html ?
ostrokach
2
Akan sangat bagus, jika seseorang, siapa pun, bahkan penulis, dapat memverifikasi dan memperbaiki tautan dan menandai komentar ini sebagai usang.
Aaron Hall
Ini buruk, karena mengasumsikan bahwa opsi telah disetel ke default sebelum operasi pencetakan yang belum tentu demikian dan dapat menyebabkan perilaku yang tidak terduga. Menggunakan konteks opsi bersama dengan pernyataan with adalah opsi yang lebih kuat dan akan kembali ke apa pun yang telah ditetapkan sebelumnya.
inVader
104

Setelah mengimpor panda, sebagai alternatif untuk menggunakan manajer konteks, setel opsi seperti itu untuk menampilkan seluruh kerangka data:

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

Untuk daftar lengkap opsi yang bermanfaat, lihat:

pd.describe_option('display')
Lucidyan
sumber
1
Terima kasih telah menambahkan ini. "Tidak ada" yang jauh lebih baik daripada panjang sebenarnya dari setiap kerangka data tunggal jika Anda ingin menampilkan lebih dari satu kerangka data.
Dremet
5
@Corrumpo Untuk beberapa opsi, Anda harus menggunakan -1nilai int alih-alih None, jika Anda menginginkan representasi penuh
lucidyan
Awalan display.dalam nama opsi sepertinya tidak perlu. Misalnya, set_option('max_columns')berfungsi sama baiknya.
Acumenus
Terima kasih banyak :)
Orsiris de Jong
45

Gunakan paket tabulasi:

pip install tabulate

Dan perhatikan contoh penggunaan berikut:

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 |
+----+--------------+---------+-------+
Kucing Unfun
sumber
tabulasi menjadi rusak ketika mencetak pd.Series.
eliu
2
@eliu Terima kasih atas informasinya. Anda selalu memilikipd_series.to_frame()
The Unfun Cat
20

Jika Anda menggunakan Ipython Notebook (Jupyter). Anda bisa menggunakan HTML

from IPython.core.display import HTML
display(HTML(df.to_html()))
R Kisyula
sumber
1
tolong tunjukkan output untuk perbandingan dengan solusi lain, Tnx.
vwvan
7
Berhati-hatilah untuk mencoba menunjukkan dataframe besar dengan ini. Anda mungkin kehabisan memori dan tidak akan pernah bisa membuka lagi notebook Anda kecuali Anda mengedit kode mentah dalam file .ipyndb Anda. Kisah nyata;)
FLBKernel
Ini pilihan terbaik bagi saya. Tabel ditampilkan penuh dengan pewarnaan. Yang bagus!
Ololade
20

Menggunakan pd.options.display

Jawaban ini adalah variasi dari jawaban sebelumnya oleh lucidyan . Itu membuat kode lebih mudah dibaca dengan menghindari penggunaan set_option.

Setelah mengimpor panda, sebagai alternatif untuk menggunakan manajer konteks, setel opsi seperti itu untuk menampilkan kerangka data yang besar:

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()

Setelah ini, Anda dapat menggunakan salah satu display(df)atau hanya dfjika menggunakan notebook, jika tidak print(df).

Menggunakan to_string

Pandas 0.25.3 memang memiliki DataFrame.to_stringdan Series.to_stringmetode yang menerima opsi pemformatan.

Menggunakan to_markdown

Jika yang Anda butuhkan adalah output penurunan harga, Pandas 1.0.0 telah DataFrame.to_markdown dan Series.to_markdownmetode.

Menggunakan to_html

Jika yang Anda butuhkan adalah output HTML, Pandas 0.25.3 memang memiliki DataFrame.to_htmlmetode tetapi tidak a Series.to_html. Perhatikan bahwa a Seriesdapat dikonversi ke a DataFrame.

Acumenus
sumber
Ya ini muncul cara elegan yang lebih baik untuk ditampilkan di Jupyter daripada set_option. Apakah ada cara untuk menyelaraskan output yang ditampilkan? Baris kanan dari kerangka data yang ditampilkan disejajarkan dengan benar secara default.
vinsinraw
11

Coba ini

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)
Liang Zulin
sumber
3

Anda dapat mencapai ini menggunakan metode di bawah ini. hanya melewati jumlah total. kolom yang ada di DataFrame sebagai arg to

'display.max_columns'

Untuk misalnya:

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

Coba gunakan fungsi display (). Ini akan secara otomatis menggunakan bilah gulir Horizontal dan vertikal dan dengan ini Anda dapat menampilkan dataset berbeda dengan mudah daripada menggunakan print ().

display(dataframe)

display () juga mendukung perataan yang tepat.

Namun jika Anda ingin membuat dataset lebih indah, Anda dapat memeriksanya pd.option_context(). Ini memiliki banyak opsi untuk menampilkan kerangka data dengan jelas.

Catatan - Saya menggunakan Notebook Jupyter.

Sabari Wisnu Jayanthan J
sumber