एक पंडों डेटाफ्रेम मुद्रण सुंदर


113

मैं निम्नलिखित की तरह एक अच्छा टेक्स्ट-आधारित तालिका के रूप में एक पंडों डेटाफ्रेम को कैसे प्रिंट कर सकता हूं?

+------------+---------+-------------+
| 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))सूचकांक से छुटकारा पाने के लिए कर सकते हैं
पेड्रो एम डुटर्टे

1
जब आप पंक्ति अनुक्रमणिका और स्तंभों में पदानुक्रम रखते हैं तो बहुत अच्छी तरह से काम नहीं करता है।
सिद्धार्थ

सुनिश्चित करें कि आप करते हैं print(tabulate(df, **kwargs))और बस नहीं tabulate(df, **kwargs); उत्तरार्द्ध सभी नई लाइनों को दिखाएगा \n....
ड्रोर

6
बाएं इंडेक्स कॉलम को दबाने के लिए एक को भी जोड़ना हो सकता हैshowindex=False
आर्थर


17

पांडा> = 1.0

यदि आप अपने डेटा को कुछ गिटब मार्कडाउन में डंप करने के लिए इनबिल्ट फंक्शन चाहते हैं, तो अब आपके पास एक है। पर एक नज़र रखना 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पैकेज स्थापित करना होगा।


16

यदि आप Jupyter नोटबुक में हैं, तो आप डेटाफ़्रेम को एक अच्छी तरह से स्वरूपित तालिका में प्रदर्शित करने के लिए निम्नलिखित कोड चला सकते हैं।

यह उत्तर ऊपर__html ('temp.html') उत्तर पर बनाता है, लेकिन एक फ़ाइल बनाने के बजाय सीधे नोटबुक में अच्छी तरह से स्वरूपित तालिका प्रदर्शित करता है:

from IPython.display import display, HTML

display(HTML(df.to_html()))

उदाहरण के कारण इस कोड के लिए क्रेडिट: iPython नोटबुक में तालिका के रूप में DataFrame दिखाएं


15

आप तालिका को पाठ के रूप में प्रस्तुत करने के लिए बहुत सुंदर का उपयोग कर सकते हैं । ट्रिक है 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

@ तो यह अब बनाए रखा नहीं है?
मुन

prettytableअप्रैल 6 के बाद से कोई रिलीज़ नहीं हुई है, 2013। tabulateइसके आध्यात्मिक पूर्ववर्ती हैं और नियमित रूप से रिलीज़ होते हैं, सबसे हाल ही में 24 जनवरी, 2019 को पेश किया जा रहा है।
नोडी

7

मैंने थोड़ी देर के लिए ओफर के जवाब का इस्तेमाल किया और इसे ज्यादातर मामलों में शानदार पाया। दुर्भाग्य से, पांडा के to_csv और prettytable from_csv के बीच विसंगतियों के कारण , मुझे एक अलग तरीके से prettytable का उपयोग करना पड़ा।

एक विफलता का मामला एक डेटाफ्रेम है जिसमें अल्पविराम होता है:

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

सुंदरता फॉर्म की एक त्रुटि उठाती है:

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()फ़ंक्शन पंडों डेटाफ्रेम के सूचकांक को प्रिंट नहीं करता है। मैंने इंडेक्स का उपयोग करके सेट किया है df.index.name = 'index'लेकिन यह इंडेक्स कॉलम को नाम से नहीं छापता है।
एडज

2

यदि आप कर रहे हैं, तो मार्क के उत्तर के बाद किसी कारण से ज्यूपिटर का उपयोग नहीं कर , जैसे आप कंसोल पर कुछ त्वरित परीक्षण करना चाहते हैं, तो आप DataFrame.to_stringविधि का उपयोग कर सकते हैं , जो काम करता है - कम से कम - पंडों 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)
आउटपुट:
+ ------- + ---- + ----- +
| ए | बी | सी |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +

-5

मुझे डेटाफ़्रेम का एक पेपर प्रिंटआउट चाहिए था लेकिन मैं उसी पृष्ठ पर कुछ परिणाम और टिप्पणियां जोड़ना चाहता था। मैंने ऊपर के माध्यम से काम किया है और मुझे वह नहीं मिला जो मैं चाहता था। मैंने पेज पर अपने एक्स्ट्रा पाने के लिए file.write (df1.to_csv ()) और file.write (",,, blah ,,,,,, blah") स्टेटमेंट का उपयोग कर समाप्त किया। जब मैंने सीएसवी फ़ाइल खोली तो यह सीधे एक स्प्रेडशीट में चली गई, जिसने सब कुछ सही गति और प्रारूप में मुद्रित किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.