Pretty Pandalar veri çerçevesini yazdırma


115

Pandalar veri çerçevesini aşağıdaki gibi metin tabanlı güzel bir tablo olarak nasıl yazdırabilirim?

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

Yanıtlar:


181

Bu ihtiyaç için harika bir araç buldum, buna tablo deniyor .

Tablo verilerini yazdırır ve ile çalışır 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        |
+----+-----------+-------------+

Not:

Tüm veri türleri için satır dizinlerini gizlemek için, showindex="never"veya showindex=False.


5
Kanama sınırına erişiminiz yoksa tabulate([list(row) for row in df.values], headers=list(df.columns)), dizinden kurtulmak için yapabilirsiniz
Pedro M Duarte

1
Satır dizini ve sütunlarda hiyerarşileriniz olduğunda pek iyi çalışmaz.
Siddharth

print(tabulate(df, **kwargs))Basitçe değil, yaptığınızdan emin olun tabulate(df, **kwargs); ikincisi tüm yeni satırları gösterecek \n....
Dror

6
Sol dizin sütununu showindex=False
Arthur


19

pandalar> = 1.0

Dahili bir işlevin verilerinizi bazı github markdown'a dökmesini istiyorsanız, şimdi bir tane var. Şuna bir göz atın 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 |

İşte bunun github'da nasıl göründüğü:

görüntü açıklamasını buraya girin

tabulatePaketi yine de kurmanız gerekeceğini unutmayın .


17

Jupyter not defterindeyseniz, veri çerçevesini iyi biçimlendirilmiş bir tabloda etkileşimli olarak görüntülemek için aşağıdaki kodu çalıştırabilirsiniz.

Bu cevap, yukarıdaki to_html ('temp.html') cevabına dayanmaktadır, ancak bir dosya oluşturmak yerine, iyi biçimlendirilmiş tabloyu doğrudan not defterinde görüntüler:

from IPython.display import display, HTML

display(HTML(df.to_html()))

Bu kod için kredi: DataFrame'i iPython Notebook'ta tablo olarak göster


15

Tabloyu metin olarak işlemek için prettytable'ı kullanabilirsiniz . İşin püf noktası data_frame'i bellek içi bir csv dosyasına dönüştürmek ve oldukça kolay bir şekilde okumasını sağlamaktır. İşte kod:

from StringIO import StringIO
import prettytable    

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

Bu pandaların hangi versiyonuydu?
WAF

4
AFAIK, prettytablebüyük ölçüde terk edilmiş yazılım olarak kabul edilir. Güzel bir paket olduğu için de utanç verici. :(
dmn

@dmn yani artık korunmuyor?
muon

prettytable6 Nisan 2013'ten beri herhangi bir sürüm yayınlanmadı. tabulateruhani selefi ve düzenli sürümleri var, en son 24 Ocak 2019'da.
noddy

7

Bir süre Ofer'in cevabını kullandım ve çoğu durumda harika buldum. Ne yazık ki, pandas'ın to_csv'si ile prettytable'ın from_csv'si arasındaki tutarsızlıklar nedeniyle , prettytable'ı farklı bir şekilde kullanmak zorunda kaldım.

Bir hata durumu, virgül içeren bir veri çerçevesidir:

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

Prettytable şu biçimde bir hata veriyor:

Error: Could not determine delimiter

Aşağıdaki işlev bu durumu ele alır:

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

Dizin umurunuzda değilse, şunu kullanın:

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

Merhaba, format_for_print()işlev Pandas DataFrame dizinini yazdırmıyor gibi görünüyor. İndeksi kullanarak ayarladım df.index.name = 'index'ama bu indeks sütununu bir adla yazdırmıyor.
edesz

3

Eğer eğer, Mark'ın Yanıta takibi değil konsolun üzerinde bazı hızlı testler yapmak istiyorum örneğin, nedense Jupyter kullanarak kullanabilirsiniz DataFrame.to_stringitibaren Pandalar 0.12 (2014) - en azından - çalışır yöntemi, .

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

Belki böyle bir şey arıyorsunuz:

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)
Çıktı:
+ ------- + ---- + ----- +
| a | b | c |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +

-6

Bir veri çerçevesinin kağıt çıktısını istedim, ancak aynı sayfaya bazı sonuçları ve yorumları da eklemek istedim. Yukarıdakiler üzerinde çalıştım ve istediğimi alamadım. Sayfadaki ekstralarımı almak için file.write (df1.to_csv ()) ve file.write (",,, blah ,,,,,, blah") ifadelerini kullandım. Csv dosyasını açtığımda, doğrudan her şeyi doğru hız ve formatta yazdıran bir elektronik tabloya gitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.