พริตตี้การพิมพ์ดาต้าเฟรมแพนด้า


115

ฉันจะพิมพ์ดาต้าเฟรมแพนด้าเป็นตารางข้อความที่ดีดังต่อไปนี้ได้อย่างไร

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

คำตอบ:


181

ฉันได้พบเพียงเครื่องมือที่ดีสำหรับความต้องการที่จะเรียกว่าจัดระเบียบ

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

บันทึก:

ดัชนีแถวปราบสำหรับทุกประเภทของข้อมูลที่ผ่านหรือshowindex="never"showindex=False


5
หากคุณไม่สามารถเข้าถึงขอบเลือดออกได้คุณสามารถ tabulate([list(row) for row in df.values], headers=list(df.columns))กำจัดดัชนีได้
Pedro M Duarte

1
ทำงานได้ไม่ดีนักเมื่อคุณมีลำดับชั้นในดัชนีแถวและคอลัมน์
Siddharth

ตรวจสอบให้แน่ใจว่าคุณทำprint(tabulate(df, **kwargs))และไม่เพียงtabulate(df, **kwargs); ตอนหลังจะแสดงบรรทัดใหม่ทั้งหมด\n....
Dror

6
หากต้องการระงับคอลัมน์ดัชนีด้านซ้ายเราอาจต้องการเพิ่มshowindex=False
Arthur


19

แพนด้า> = 1.0

หากคุณต้องการให้ฟังก์ชัน inbuilt ถ่ายโอนข้อมูลของคุณลงใน github markdown คุณมีแล้ว ดูที่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 |

นี่คือสิ่งที่ดูเหมือนใน github:

ป้อนคำอธิบายภาพที่นี่

โปรดทราบว่าคุณยังคงต้องtabulateติดตั้งแพ็คเกจ


17

หากคุณอยู่ในสมุดบันทึก Jupyter คุณสามารถรันโค้ดต่อไปนี้เพื่อแสดงดาต้าเฟรมแบบโต้ตอบในตารางที่จัดรูปแบบได้ดี

คำตอบนี้สร้างจากคำตอบ to_html ('temp.html') ด้านบน แต่แทนที่จะสร้างไฟล์จะแสดงตารางที่จัดรูปแบบไว้อย่างดีโดยตรงในสมุดบันทึก:

from IPython.display import display, HTML

display(HTML(df.to_html()))

เครดิตสำหรับรหัสนี้เนื่องจากตัวอย่างที่: แสดง DataFrame เป็นตารางใน iPython Notebook


15

คุณสามารถใช้prettytableเพื่อแสดงตารางเป็นข้อความ เคล็ดลับคือการแปลง data_frame เป็นไฟล์ csv ในหน่วยความจำและอ่านได้อย่างสวยงาม นี่คือรหัส:

from StringIO import StringIO
import prettytable    

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

แพนด้านี่รุ่นอะไร
WAF

4
AFAIK prettytableถือเป็นเครื่องละทิ้งส่วนใหญ่ น่าเสียดายเหมือนกันเพราะมันเป็นแพ็คเกจที่ดี :(
dmn

@dmn เลยไม่ดูแลอีกต่อไป?
muon

prettytableไม่ได้มีการปล่อยตั้งแต่วันที่ 6 เม.ย. 2013 tabulateเป็นผู้บุกเบิกทางจิตวิญญาณและมีรุ่นปกติถูกล่าสุดบนวันที่ 24 ม.ค. 2019
โง่

7

ฉันใช้คำตอบของ Ofer มาระยะหนึ่งแล้วและพบว่ามันยอดเยี่ยมในกรณีส่วนใหญ่ น่าเสียดายเนื่องจากความไม่สอดคล้องกันระหว่างto_csv ของแพนด้าและน่ารักของ prettytable ฉันจึงต้องใช้ prettytable ในวิธีที่แตกต่างออกไป

กรณีความล้มเหลวหนึ่งกรณีคือดาต้าเฟรมที่มีเครื่องหมายจุลภาค:

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

Prettytable ทำให้เกิดข้อผิดพลาดของแบบฟอร์ม:

Error: Could not determine delimiter

ฟังก์ชันต่อไปนี้จัดการกรณีนี้:

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

หากคุณไม่สนใจดัชนีให้ใช้:

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

สวัสดีformat_for_print()ฟังก์ชั่นนี้ดูเหมือนจะไม่ได้พิมพ์ดัชนีของ Pandas DataFrame ฉันตั้งค่าดัชนีโดยใช้df.index.name = 'index'แต่สิ่งนี้ไม่ได้พิมพ์คอลัมน์ดัชนีด้วยชื่อ
edesz

3

ติดตามคำตอบของ Mark หากคุณไม่ได้ใช้ Jupyter ด้วยเหตุผลบางประการเช่นคุณต้องการทำการทดสอบอย่างรวดเร็วบนคอนโซลคุณสามารถใช้DataFrame.to_stringวิธีนี้ซึ่งใช้ได้ผลตั้งแต่ - อย่างน้อย - Pandas 0.12 (2014) เป็นต้นไป .

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

บางทีคุณอาจกำลังมองหาสิ่งนี้:

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)
เอาท์พุต:
+ ------- + ---- + ----- +
| ก | b | ค |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +

-6

ฉันต้องการพิมพ์ดาต้าเฟรมแบบกระดาษ แต่ฉันต้องการเพิ่มผลลัพธ์และความคิดเห็นในหน้าเดียวกัน ฉันได้ทำงานผ่านข้างต้นแล้วและฉันไม่สามารถได้รับสิ่งที่ต้องการ ฉันลงเอยด้วยการใช้คำสั่ง file.write (df1.to_csv ()) และ file.write (",,, blah ,,,,,, blah") เพื่อรับส่วนเสริมของฉันบนหน้า เมื่อฉันเปิดไฟล์ csv มันจะตรงไปยังสเปรดชีตซึ่งพิมพ์ทุกอย่างในจังหวะและรูปแบบที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.