Pretty Printing a pandas dataframe

114

Bagaimana cara mencetak bingkai data pandas sebagai tabel berbasis teks yang bagus, seperti berikut ini?

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

Jawaban:

181

Saya baru saja menemukan alat yang hebat untuk kebutuhan itu, yang disebut tabulasi .

Ini mencetak data tabular dan bekerja dengan 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        |
+----+-----------+-------------+

catatan:

Untuk menekan indeks baris untuk semua jenis data, teruskan showindex="never"atau showindex=False.

Romain
sumber
5
Jika Anda tidak memiliki akses ke sisi terbaru, Anda dapat melakukannya tabulate([list(row) for row in df.values], headers=list(df.columns))untuk menghilangkan indeks
Pedro M Duarte
1
Tidak berfungsi dengan baik saat Anda memiliki hierarki di indeks baris dan kolom.
Siddharth
Pastikan Anda melakukannya print(tabulate(df, **kwargs))dan tidak sederhana tabulate(df, **kwargs); yang terakhir akan menampilkan semua baris baru \n....
Dror
6
Untuk menekan kolom indeks kiri seseorang mungkin ingin juga menambahkanshowindex=False
Arthur
23

Pendekatan sederhananya adalah dengan mengeluarkan sebagai html, yang dilakukan panda di luar kotak :

df.to_html('temp.html')
ErichBSchulz
sumber
17

panda> = 1.0

Jika Anda ingin fungsi bawaan untuk membuang data Anda ke beberapa penurunan harga github, Anda sekarang memilikinya. Lihat di 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 |

Inilah tampilannya di github:

masukkan deskripsi gambar di sini

Perhatikan bahwa Anda masih perlu tabulatemenginstal paket.

cs95
sumber
16

Jika Anda menggunakan notebook Jupyter, Anda dapat menjalankan kode berikut untuk menampilkan dataframe secara interaktif dalam tabel yang diformat dengan baik.

Jawaban ini dibuat berdasarkan jawaban to_html ('temp.html') di atas, tetapi alih-alih membuat file, tampilkan tabel yang diformat dengan baik langsung di buku catatan:

from IPython.display import display, HTML

display(HTML(df.to_html()))

Kredit untuk kode ini karena contoh di: Tampilkan DataFrame sebagai tabel di Notebook iPython

Mark Andersen
sumber
15

Anda dapat menggunakan prettytable untuk membuat tabel sebagai teks. Triknya adalah dengan mengubah data_frame menjadi file csv dalam memori dan meminta cukup untuk membacanya. Berikut kodenya:

from StringIO import StringIO
import prettytable    

output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt
Ofer
sumber
Versi panda apa ini?
WAF
4
AFAIK, prettytablesebagian besar dianggap perangkat pengabaian. Malu juga, karena itu paket yang bagus. :(
dmn
@dmn jadi sudah tidak terawat lagi?
muon
prettytablebelum dirilis sejak 6 April 2013. tabulateadalah pendahulu spiritualnya dan memiliki rilis rutin, yang terbaru pada 24 Jan 2019.
noddy
7

Saya menggunakan jawaban Ofer untuk sementara waktu dan menganggapnya bagus dalam banyak kasus. Sayangnya, karena inkonsistensi antara to_csv panda ini dan prettytable from_csv 's, saya harus menggunakan prettytable dengan cara yang berbeda.

Satu kasus kegagalan adalah kerangka data yang berisi koma:

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

Prettytable menimbulkan kesalahan dalam bentuk:

Error: Could not determine delimiter

Fungsi berikut menangani kasus ini:

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

Jika Anda tidak peduli dengan indeks, gunakan:

def format_for_print2(df):    
    table = PrettyTable(list(df.columns))
    for row in df.itertuples():
        table.add_row(row[1:])
    return str(table)
ejrb.dll
sumber
Hai, format_for_print()tampaknya fungsi tersebut tidak mencetak indeks Pandas DataFrame. Saya mengatur indeks menggunakan df.index.name = 'index'tetapi ini tidak mencetak kolom indeks dengan nama.
edesz
2

Menindaklanjuti jawaban Mark, jika Anda tidak menggunakan Jupyter karena alasan tertentu, misalnya Anda ingin melakukan beberapa pengujian cepat di konsol, Anda dapat menggunakan DataFrame.to_stringmetode yang berfungsi dari - setidaknya - Pandas 0.12 (2014) dan seterusnya .

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
sigint
sumber
0

Mungkin Anda sedang mencari sesuatu seperti ini:

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)
Keluaran:
+ ------- + ---- + ----- +
| a | b | c |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +
Pafkone
sumber
-6

Saya ingin cetakan kertas kerangka data tetapi saya ingin menambahkan beberapa hasil dan komentar juga di halaman yang sama. Saya telah bekerja melalui hal-hal di atas dan saya tidak bisa mendapatkan apa yang saya inginkan. Saya akhirnya menggunakan pernyataan file.write (df1.to_csv ()) dan file.write (",,, blah ,,,,,, blah") untuk mendapatkan tambahan saya di halaman. Ketika saya membuka file csv, file itu langsung masuk ke spreadsheet yang mencetak semuanya dengan kecepatan dan format yang benar.

jon
sumber