พริตตี้พิมพ์ Pandas Series / DataFrame ทั้งหมด


651

ฉันทำงานกับ Series และ DataFrames บนเทอร์มินัลเป็นจำนวนมาก ค่าเริ่มต้น__repr__สำหรับซีรี่ส์จะส่งคืนตัวอย่างที่ลดลงโดยมีค่าส่วนหัวและส่วนท้าย แต่ส่วนที่เหลือหายไป

มีวิธีการพิมพ์สวย ๆ ในซีรีส์ / DataFrame ทั้งหมดหรือไม่? จะเป็นการดีที่จะสนับสนุนการจัดตำแหน่งที่เหมาะสมอาจจะเส้นขอบระหว่างคอลัมน์และอาจเข้ารหัสสีสำหรับคอลัมน์ที่แตกต่างกัน


19
ผลลัพธ์ที่ลดลงเกิดจากตัวเลือกเริ่มต้นที่คุณสามารถเปลี่ยนได้pd.set_option('display.max_rows', 1000)ตัวอย่างเช่นการระบายสีเป็นอย่างอื่นฉันคิดว่าคุณกำลังพูดถึงการระบายสีเอาต์พุตการพิมพ์ html ฉันไม่คิดว่าสิ่งนี้จะถูกสร้างขึ้นทั้งหมด
EdChum

2
@EdChum: ขอบคุณฉันรู้เกี่ยวกับเรื่องนี้display.max_rowsปัญหาคือเวลาส่วนใหญ่ที่ฉันต้องการจะตัดทอนผลลัพธ์ เป็นครั้งคราวเท่านั้นที่ฉันต้องการดูผลลัพธ์เต็ม ฉันสามารถตั้งค่าตัวเลือกให้มีค่าสูงมากใช้ค่าเริ่มต้น__repr__จากนั้นเปลี่ยนค่ากลับมา แต่ดูเหมือนจะค่อนข้างยุ่งยากและฉันอาจเขียนฟังก์ชั่นการพิมพ์สวย ๆ ของตัวเองในกรณีนั้น
Dun Peal

1
@EdChum: เกี่ยวกับสี - นี่คือเทอร์มินัลสีดังนั้นจะเป็นการดีถ้าให้แต่ละแถวพิมพ์ด้วยสีที่แตกต่างกันเพื่อแยกความแตกต่างของค่าจากกันและกันได้อย่างง่ายดาย Pandas ทำงานได้ดีกับ ipython ซึ่งใช้คุณสมบัติเทอร์มินัลขั้นสูง - รวมถึงสี - ดังนั้นฉันสงสัยว่า Pandas มีความสามารถในการระบายสีบ้างหรือไม่
Dun Peal

1
ฉันใช้ Pandas ใน IPython Notebook มากกว่า IPython เป็นเทอร์มินัลเชลล์ฉันไม่เห็นตัวเลือกใด ๆset_optionที่สนับสนุนการระบายสีมันอาจเป็นสิ่งที่สามารถทำได้เป็นปลั๊กอินเพื่อใช้ css หรือการจัดรูปแบบผลลัพธ์ นี่เป็นวิธีเดียวที่ฉันคิดว่าคุณสามารถทำสิ่งนี้ได้
EdChum

คำตอบ:


863

นอกจากนี้คุณยังสามารถใช้option_contextตัวเลือกอย่างน้อยหนึ่งตัวเลือก:

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

การทำเช่นนี้จะส่งคืนตัวเลือกโดยอัตโนมัติไปยังค่าก่อนหน้า

หากคุณกำลังทำงานอยู่ jupyter โน๊ตบุ๊คที่ใช้display(df)แทนการprint(df)จะใช้ jupyter ตรรกะการแสดงผลที่อุดมไปด้วย(ชอบ)


2
ขอบคุณ! โปรดทราบว่าการตั้งค่าสูงสุดที่Noneจะปิดพวกเขา การใช้with pd.option_context()เอกสารตัวเลือกสิ่งที่เกิดขึ้นมากอย่างเห็นได้ชัดและชัดเจนและทำให้มันชัดเจนว่าเพื่อให้เกิดการเปลี่ยนแปลงอื่น ๆ ในการส่งออกการจัดรูปแบบที่อาจจะต้องการใช้เช่นprecision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encodingและหลายอื่น ๆ อีกมากมาย: pandas.pydata.org/pandas -docs / stable / options.html
nealmcb

37
สำหรับผู้ที่สงสัยว่า: เมื่อใช้ jupyter ให้ใช้display(df)แทนprint(df)
tsvikas

3
3 สิ่งที่เป็นตัวแทนของที่นี่?
Mona Jalal

1
หาก DataFrame มีขนาดใหญ่มากมันอาจสมเหตุสมผลที่จะเขียนมันเป็น. csv ชั่วคราวและใช้โปรแกรมดู csv ที่รวดเร็วของ Jupyter Lab
Dan

นั่นคือ '3' สำหรับ display.max_columns ควรเป็น 'ไม่มี' เพื่อตั้งค่า Option_context param ให้เป็นค่าเริ่มต้น แก้ไขแล้ว.
Trutane

605

ไม่จำเป็นต้องตั้งค่าแฮ็ค มีวิธีง่าย ๆ :

print(df.to_string())

1
คุณมีกี่คอลัมน์ ฉันได้ตรวจสอบกับ 1300 คอลัมน์และใช้งานได้ดี: จาก itertools นำเข้าชุดค่าผสมจากการอิมพอร์ตสตริง ascii_letters df = pd.DataFrame (data = [[0] * 1326], ดัชนี = [0], คอลัมน์ = [(a + b) สำหรับ a, b ในชุดค่าผสม (ascii_letters, 2)])
Andrey Shokhin

11
การใช้with pd.option_context()เอกสารตัวเลือกสิ่งที่เกิดขึ้นมากขึ้นอย่างเห็นได้ชัดและชัดเจนและทำให้มันชัดเจนว่าเพื่อให้เกิดการเปลี่ยนแปลงอื่น ๆ ในการส่งออกการจัดรูปแบบที่อาจจะต้องการใช้เช่นprecision, max_colwidth, expand_frame_repr, colheader_justify, date_yearfirst, encodingและหลายอื่น ๆ อีกมากมาย: pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb

2
ฉันชอบคำตอบอื่น ๆ เพราะนี่ดูแปลกในตัวอย่างของฉันถ้าฉันมีคอลัมน์จำนวนมากและหน้าจอของฉันไม่กว้างพอที่จะแสดง ชื่อคอลัมน์และข้อมูลจะแยกตัวแบ่งบรรทัดดังนั้นจึงไม่ง่ายที่จะดูว่าข้อมูลใดเป็นของชื่อคอลัมน์ใดอีกต่อไป
Dremet

9
ผู้ถามร้องขอวิธีแก้ปัญหา "พิมพ์สวย" อันนี้มันไม่ได้ หากสิ่งนี้ถูกใช้ภายใน Jupyter Notebook หน้าจอสวยในตัวจะไม่ถูกใช้งานเลย มันเป็นเรื่องดีที่จะใช้เพียงแค่ก่อนที่จะพิมพ์pd.set_option('display.max_rows', None) df
LS

@LS ทดสอบทั้ง pd.set_option ('display.max_rows', None) และ df.to_string () บน python 3.x Jupyter notebook และพวกมันก็สร้างเอาต์พุตเดียวกันเมื่อพิมพ์ หากคำตอบข้างต้นไม่ได้ผลสำหรับเวอร์ชั่นก่อน
H Froedge

166

แน่นอนถ้าสิ่งนี้เกิดขึ้นมากมายทำหน้าที่อย่างนี้ คุณสามารถกำหนดค่าให้โหลดทุกครั้งที่คุณเริ่ม 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')

สำหรับการระบายสีการทำความเข้าใจกับสีเกินไปนั้นฟังดูไม่ดีสำหรับฉัน แต่ฉันเห็นด้วยอย่างเช่นbootstrap.table-stripedก็ดี คุณสามารถสร้างปัญหาเพื่อแนะนำคุณสมบัตินี้ได้เสมอ


5
ลิงก์ตาย บางทีมันควรจะเป็นipython.org/ipython-doc/dev/config/intro.html ?
ostrokach

2
คงจะดีถ้ามีใครบางคนแม้แต่ผู้แต่งอาจจะสามารถตรวจสอบและแก้ไขลิงก์และตั้งค่าสถานะความคิดเห็นเหล่านี้ว่าล้าสมัยได้
Aaron Hall

สิ่งนี้ไม่ดีเนื่องจากถือว่าตัวเลือกถูกตั้งค่าเป็นค่าเริ่มต้นก่อนการดำเนินการพิมพ์ซึ่งไม่จำเป็นต้องเป็นตัวพิมพ์เล็กและอาจนำไปสู่พฤติกรรมที่ไม่คาดคิด การใช้บริบทตัวเลือกร่วมกับคำสั่งwithเป็นตัวเลือกที่มีประสิทธิภาพมากขึ้นและจะเปลี่ยนกลับเป็นสิ่งที่ตั้งไว้ก่อนหน้า
inVader

104

หลังจากอิมพอร์ตหมีแพนด้าแทนการใช้ตัวจัดการบริบทให้ตั้งค่าตัวเลือกดังกล่าวสำหรับการแสดงดาต้าเฟรมทั้งหมด:

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

สำหรับรายการตัวเลือกที่มีประโยชน์ทั้งหมดโปรดดู:

pd.describe_option('display')

1
ขอบคุณที่เพิ่มสิ่งนี้ "ไม่มี" เป็นวิธีที่ดีกว่าความยาวจริงของแต่ละดาต้าเฟรมเดียวถ้าคุณต้องการแสดงมากกว่าหนึ่งดาต้าเฟรม
Dremet

5
@Corrumpo สำหรับตัวเลือกบางตัวคุณควรใช้-1ค่า int แทนNoneถ้าคุณต้องการการแทนแบบเต็ม
lucidyan

คำนำหน้าdisplay.ในชื่อตัวเลือกดูเหมือนจะไม่จำเป็น ตัวอย่างเช่นset_option('max_columns')ทำงานได้ดีเท่า ๆ กัน
คิวเมนตัส

ขอบคุณมาก :)
Orsiris de Jong

45

ใช้แพ็คเกจแบบตาราง:

pip install tabulate

และพิจารณาการใช้งานตัวอย่างต่อไปนี้:

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

ตารางไปยุ่งเหยิงเมื่อพิมพ์ pd.Series
eliu

2
@eliu ขอบคุณสำหรับข้อมูล คุณมักจะมีpd_series.to_frame()
แมวเหม็นเมื่อ

20

หากคุณใช้ Ipython Notebook (Jupyter) คุณสามารถใช้ HTML

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

1
โปรดแสดงผลลัพธ์สำหรับการเปรียบเทียบกับโซลูชันอื่น Tnx
vwvan

7
ระวังการแสดง Dataframe อันยิ่งใหญ่ด้วยสิ่งนี้ คุณอาจมีหน่วยความจำไม่เพียงพอและไม่สามารถเปิดโน้ตบุ๊กของคุณได้อีกเว้นแต่คุณจะแก้ไขรหัส raw ในไฟล์. ipyndb ของคุณ เรื่องจริง;)
FLBKernel

นี่คือตัวเลือกที่ดีที่สุดสำหรับฉัน ตารางแสดงเต็มไปด้วยการระบายสี ทำได้ดีนี่!
Ololade

20

การใช้ pd.options.display

คำตอบนี้เป็นรูปแบบของการก่อนคำตอบโดย lucidyan set_optionมันทำให้โค้ดอ่านได้มากขึ้นโดยการหลีกเลี่ยงการใช้งานของ

หลังจากอิมพอร์ตหมีแพนด้าแทนการใช้ตัวจัดการบริบทให้ตั้งค่าตัวเลือกดังกล่าวสำหรับการแสดงดาต้าเฟรมขนาดใหญ่:

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

หลังจากนี้คุณสามารถใช้อย่างใดอย่างหนึ่งdisplay(df)หรือเพียงแค่ถ้าใช้โน๊ตบุ๊คมิฉะนั้นdfprint(df)

การใช้ to_string

Pandas 0.25.3 มีDataFrame.to_stringและSeries.to_stringวิธีการที่ยอมรับตัวเลือกการจัดรูปแบบ

การใช้ to_markdown

หากสิ่งที่คุณต้องการคือเอาท์พุทมาร์กดาวน์, Pandas 1.0.0 มีDataFrame.to_markdownและSeries.to_markdownวิธี

การใช้ to_html

หากสิ่งที่คุณต้องการก็คือการแสดงผล HTML, นุ่น 0.25.3 จะมีDataFrame.to_htmlวิธีการ Series.to_htmlแต่ไม่ได้เป็น ทราบว่าSeriesสามารถแปลงDataFrameไป


ใช่นี่เป็นวิธีที่ดีกว่าในการแสดงใน Jupyter แทนที่จะเป็น set_option มีวิธีการจัดแนวซ้ายของเอาต์พุตที่แสดงหรือไม่? แถวขวาของ dataframe ที่แสดงจะจัดเรียงชิดขวาโดยค่าเริ่มต้น
vinsinraw


3

คุณสามารถทำได้โดยใช้วิธีการด้านล่าง เพียงผ่านจำนวนรวม ของคอลัมน์ที่มีอยู่ใน DataFrame ตามที่อ้างถึง

'display.max_columns'

สำหรับเช่น:

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

-1

ลองใช้ฟังก์ชั่น display () สิ่งนี้จะใช้แถบเลื่อนแนวนอนและแนวตั้งโดยอัตโนมัติและด้วยวิธีนี้คุณสามารถแสดงชุดข้อมูลที่แตกต่างกันได้อย่างง่ายดายแทนที่จะใช้การพิมพ์ ()

display(dataframe)

จอแสดงผล () รองรับการจัดตำแหน่งที่เหมาะสมด้วย

อย่างไรก็ตามหากคุณต้องการทำให้ชุดข้อมูลสวยงามยิ่งขึ้นคุณสามารถตรวจสอบpd.option_context()ได้ มีตัวเลือกมากมายเพื่อแสดงดาต้าเฟรมอย่างชัดเจน

หมายเหตุ - ฉันใช้สมุดบันทึก Jupyter

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