জুপিটার নোটবুক পাশাপাশি দুটি পান্ডাস টেবিল প্রদর্শন করে


96

আমার কাছে দুটি পান্ডার ডেটাফ্রেম রয়েছে এবং আমি সেগুলি জুপিটার নোটবুকে প্রদর্শন করতে চাই।

এরকম কিছু করা:

display(df1)
display(df2)

এগুলি একে অপরের নীচে দেখায়:

এখানে চিত্র বর্ণনা লিখুন

আমি প্রথমটির ডানদিকে দ্বিতীয় ডেটাফ্রেম রাখতে চাই। নেই একটি অনুরূপ প্রশ্ন , কিন্তু এটা দেখে মনে হচ্ছে মত একজন ব্যক্তি তাদের তাদের মধ্যে পার্থক্য দেখানো এক dataframe মধ্যে মার্জ সঙ্গে পারেন সন্তুষ্ট হয়।

এটি আমার পক্ষে কাজ করবে না। আমার ক্ষেত্রে ডেটাফ্রেমগুলি সম্পূর্ণ আলাদা (তুলনীয় উপাদান নয়) উপস্থাপন করতে পারে এবং সেগুলির আকার পৃথক হতে পারে। সুতরাং আমার মূল লক্ষ্য স্থান বাঁচানো।


আমি জ্যাক ভেন্ডারপ্লাসের সমাধান পোস্ট করেছি। সুন্দর পরিষ্কার কোড।
ব্যক্তিগত

উত্তর:


90

আপনি আউটপুট কোডের সিএসএসকে ওভাররাইড করতে পারেন। এটি flex-direction: columnডিফল্টরূপে ব্যবহার করে। rowপরিবর্তে এটি পরিবর্তন করার চেষ্টা করুন । এখানে একটি উদাহরণ:

import pandas as pd
import numpy as np
from IPython.display import display, HTML

CSS = """
.output {
    flex-direction: row;
}
"""

HTML('<style>{}</style>'.format(CSS))

জুপিটার চিত্র

আপনি অবশ্যই নিজের ইচ্ছা মতো সিএসএসকে আরও কাস্টমাইজ করতে পারবেন।

আপনি যদি কেবল একটি ঘরের আউটপুট লক্ষ্য করতে চান তবে :nth-child()নির্বাচকটি ব্যবহার করে দেখুন । উদাহরণস্বরূপ, এই কোডটি নোটবুকটিতে কেবলমাত্র 5 তম ঘরের আউটপুটের সিএসএস সংশোধন করবে:

CSS = """
div.cell:nth-child(5) .output {
    flex-direction: row;
}
"""

4
এই দ্রবণটি সমস্ত কোষকে প্রভাবিত করে, আমি কীভাবে কেবল একটি ঘরের জন্য এটি করতে পারি?
jrovegno

4
আপনার সম্পর্কে অনুরোধ করা তথ্য অন্তর্ভুক্ত করার জন্য @ জর্জনগো আমি আমার উত্তর আপডেট করেছি।
জারাক

4
@ntg আপনাকে নিশ্চিত করতে হবে যে লাইনটি HTML('<style>{}</style>'.format(CSS))ঘরের শেষ লাইন (এবং নবম-শিশু নির্বাচক ব্যবহার করতে ভুলবেন না)। যাইহোক, এটি ফর্ম্যাটেটিং নিয়ে সমস্যা সৃষ্টি করতে পারে তাই আপনার সমাধান আরও ভাল is (+1)
জারাক 16

4
ধরণের কথার জন্য @ জারাক থ্যাঙ্কস :) আপনার সমাধানে, আপনি HTML ('<স্টাইল> {} </ শৈলী> '। ফর্ম্যাট (সিএসএস))। তাহলে এটি যে কোনও জায়গায় হতে পারে। আমার তখনও নবম সেলে সমস্যা ছিল যদিও (অর্থাত্ যদি আমি পেস্টটি অনুলিপি করি তবে n পরিবর্তন হতে পারে)
এনটিজি

4
HTML('<style>.output {flex-direction: row;}</style>')সরলতার জন্য
টমাস ম্যাথু

123

আমি একটি ফাংশন লিখে শেষ করেছি যা এটি করতে পারে:

from IPython.display import display_html
def display_side_by_side(*args):
    html_str=''
    for df in args:
        html_str+=df.to_html()
    display_html(html_str.replace('table','table style="display:inline"'),raw=True)

ব্যবহারের উদাহরণ:

df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=['A','B','C','D',])
df2 = pd.DataFrame(np.arange(16).reshape((4,4)),columns=['A','B','C','D',])
display_side_by_side(df1,df2,df1)

এখানে চিত্র বর্ণনা লিখুন


ধন্যবাদ এটি সত্যিই দুর্দান্ত। প্রতিটি আউটপুটের উপরে ডেটা ফ্রেমের নাম যুক্ত করা কত সহজ বা অন্যথায় হবে, আপনি কি ভাবেন?
রিকি ম্যাকমাস্টার

4
দুটি সমস্যা দেখা দেবে: 1. dataframes নাম বুদ্ধিমান সুযোগ এই প্রোগ্রামটিতে বাইরে stackoverflow.com/questions/2749796/... কিন্তু করতে পারি না stackoverflow.com/questions/218616/... , অথবা তাদের প্যারাম যেমন পাস) 2. আপনি অতিরিক্ত এইচটিএমএল এবং এটির খোলার সমাপ্তি / কী দরকার তা আপনার প্রয়োজন হবে ... এই অংশটি কীভাবে দেখতে পেল
এনটিজি

আপনার উত্তরের জন্য ধন্যবাদ, আমি আপনার শেষ মন্তব্যে যা বর্ণনা করেছি তার অনুরূপ পদ্ধতিতে আমি এতে শিরোনাম যুক্ত করেছি।
অ্যান্টনি হ্যাচকিন্স

আশ্চর্যজনক উত্তর। এটিই আমি খুঁজছি। আমি এখনও এর চারপাশে আমার পথ শিখছি, তাই আমি জানতে চাই: 1) আপনি ন্যায়বিচারের *argsপরিবর্তে কেন ব্যবহার করলেন df? আপনার একাধিক ইনপুট থাকতে পারে বলেই *args? ২) আপনার ফাংশনের কোন অংশটি ২ য় এবং পরবর্তী ডিএফ এর নীচে পরিবর্তে প্রথমটির ডানদিকে যুক্ত করে? এটা কি 'table style="display:inline"'অংশ? আবার ধন্যবাদ
বোভেন লিউ

4
আপনার দুর্দান্ত সমাধানের জন্য ধন্যবাদ! আপনি যদি আপনার ডেটাফ্রেমগুলি প্রদর্শন করার আগে তাদের স্টাইল করতে চান তবে ইনপুট Stylerগুলি হবে না DataFrame। এই ক্ষেত্রে, html_str+=df.render()পরিবর্তে ব্যবহার করুন html_str+=df.to_html()
মার্টিন বেকার

37

pandas 0.17.1ডেটাফ্রেমগুলির ভিজ্যুয়ালাইজেশন থেকে শুরু করে পান্ডাস স্টাইলিং পদ্ধতিতে সরাসরি পরিবর্তন করা যেতে পারে

পাশাপাশি দুটি ডাটাফ্রেম প্রদর্শন করতে আপনাকে এনটিজি উত্তরে প্রস্তাবিত set_table_attributesযুক্তির সাহায্যে অবশ্যই ব্যবহার করতে হবে । এটি দুটি বস্তু ফেরত দেবে । সারিবদ্ধ ডাটাফ্রেমগুলি প্রদর্শন করতে আইপিথন থেকে পদ্ধতিটির মাধ্যমে কেবল তাদের যোগদান করা এইচটিএমএল উপস্থাপনাটি পাস করুন ।"style='display:inline'"Stylerdisplay_html

এই পদ্ধতিটি সহ অন্যান্য স্টাইলিং বিকল্পগুলি যুক্ত করাও সহজ। এখানে অনুরোধ হিসাবে কীভাবে ক্যাপশন যুক্ত করবেন তা এখানে :

import numpy as np
import pandas as pd   
from IPython.display import display_html 

df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=['A','B','C','D',])
df2 = pd.DataFrame(np.arange(16).reshape((4,4)),columns=['A','B','C','D',])

df1_styler = df1.style.set_table_attributes("style='display:inline'").set_caption('Caption table 1')
df2_styler = df2.style.set_table_attributes("style='display:inline'").set_caption('Caption table 2')

display_html(df1_styler._repr_html_()+df2_styler._repr_html_(), raw=True)

ক্যাপশন সহ প্রান্তিক ডাটাফ্রেমস পান্ডাস স্টাইলার


18

গিব্বোন (স্টাইল এবং ক্যাপশন সেট করতে) এবং স্টিভি (স্পেস যুক্ত করা) এর পদ্ধতির সংমিশ্রণটি আমি আমার ফাংশনের সংস্করণ তৈরি করেছি, যা পান্ডাস ডেটা ফ্রেমগুলি টেবিলের পাশাপাশি টেবিল হিসাবে আউটপুট করে:

from IPython.core.display import display, HTML

def display_side_by_side(dfs:list, captions:list):
    """Display tables side by side to save vertical space
    Input:
        dfs: list of pandas.DataFrame
        captions: list of table captions
    """
    output = ""
    combined = dict(zip(captions, dfs))
    for caption, df in combined.items():
        output += df.style.set_table_attributes("style='display:inline'").set_caption(caption)._repr_html_()
        output += "\xa0\xa0\xa0"
    display(HTML(output))

ব্যবহার:

display_side_by_side([df1, df2, df3], ['caption1', 'caption2', 'caption3'])

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন


11

এখানে জেক ভেন্ডারপ্লাসের সমাধানটি আমি কেবলমাত্র অন্য দিনটিতে এসেছি:

import numpy as np
import pandas as pd

class display(object):
    """Display HTML representation of multiple objects"""
    template = """<div style="float: left; padding: 10px;">
    <p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
    </div>"""

    def __init__(self, *args):
        self.args = args

    def _repr_html_(self):
        return '\n'.join(self.template.format(a, eval(a)._repr_html_())
                     for a in self.args)

    def __repr__(self):
       return '\n\n'.join(a + '\n' + repr(eval(a))
                       for a in self.args)

ক্রেডিট: https://github.com/jakevdp/ পাইথনডাটা বিজ্ঞানহানডবুক / ব্লব / মাস্টার / নোটবুকস 033.08- অগ্রিগ্রেশন- এবং- গ্রুপিং.আইপিনব


4
আপনি দয়া করে এই উত্তর ব্যাখ্যা করতে পারেন? জ্যাক ভ্যান্ডারপ্লাস তার ওয়েবসাইটে এটি ব্যাখ্যা করেনি। এটি একমাত্র সমাধান যা শীর্ষে ডেটাসেটের নাম মুদ্রণ করে।
গৌরব সিংহল

আপনি কি জানতে চান?
ব্যক্তিগত

সমস্ত ফাংশনগুলির বর্ণনা / তারা কীভাবে কাজ করে, কীভাবে তাদেরকে এ জাতীয় বলা হয় ... যাতে নবাগত পাইথন প্রোগ্রামাররা এটি সঠিকভাবে বুঝতে পারে।
গৌরব সিংহল

10

আমার সমাধানটি কোনও সিএসএস হ্যাক ছাড়াই এইচটিএমএলে একটি টেবিল তৈরি করে এবং এটিকে আউটপুট দেয়:

import pandas as pd
from IPython.display import display,HTML

def multi_column_df_display(list_dfs, cols=3):
    html_table = "<table style='width:100%; border:0px'>{content}</table>"
    html_row = "<tr style='border:0px'>{content}</tr>"
    html_cell = "<td style='width:{width}%;vertical-align:top;border:0px'>{{content}}</td>"
    html_cell = html_cell.format(width=100/cols)

    cells = [ html_cell.format(content=df.to_html()) for df in list_dfs ]
    cells += (cols - (len(list_dfs)%cols)) * [html_cell.format(content="")] # pad
    rows = [ html_row.format(content="".join(cells[i:i+cols])) for i in range(0,len(cells),cols)]
    display(HTML(html_table.format(content="".join(rows))))

list_dfs = []
list_dfs.append( pd.DataFrame(2*[{"x":"hello"}]) )
list_dfs.append( pd.DataFrame(2*[{"x":"world"}]) )
multi_column_df_display(2*list_dfs)

আউটপুট


9

এটি @ এনটিএসের উত্তরে শিরোনাম যুক্ত করেছে:

from IPython.display import display_html

def mydisplay(dfs, names=[]):
    html_str = ''
    if names:
        html_str += ('<tr>' + 
                     ''.join(f'<td style="text-align:center">{name}</td>' for name in names) + 
                     '</tr>')
    html_str += ('<tr>' + 
                 ''.join(f'<td style="vertical-align:top"> {df.to_html(index=False)}</td>' 
                         for df in dfs) + 
                 '</tr>')
    html_str = f'<table>{html_str}</table>'
    html_str = html_str.replace('table','table style="display:inline"')
    display_html(html_str, raw=True)

এখানে চিত্র বর্ণনা লিখুন


এটি খুব দরকারী বলে মনে হচ্ছে তবে আমাকে একটি সমস্যা দেয়। জন্য mydisplay((df1,df2))শুধুমাত্র দেয় df.to_html(index=False) df.to_html(index=False)dataframe বিষয়বস্তুর পরিবর্তে। এছাড়াও, f'string এ অতিরিক্ত 'sign' চিহ্ন রয়েছে।

কিছুটা সম্পর্কহীন তবে আপনার ফাংশনটি সংশোধন করা কি সম্ভব যাতে সেল আউটপুটটির কোডটি লুকানো থাকে?
alpenmilch411

4
@ alpenmilch411 "ইনপুট লুকান" এক্সটেনশন দেখুন
অ্যান্টনি হ্যাচকিন্স 20:58

এটি কীভাবে 'ম্যাক্স_আরোজ' যুক্ত করবেন কোনও ধারণা?
টিকন

মাল্টি ইনডেক্সড ডেটা ফ্রেম ব্যবহার করা হলে এটি বহু সূচকও হারায়।
পার্থিব রাজেন্দ্রন

2

আমি HBOX ব্যবহার করে শেষ করেছি

import ipywidgets as ipyw

def get_html_table(target_df, title):
    df_style = target_df.style.set_table_attributes("style='border:2px solid;font-size:10px;margin:10px'").set_caption(title)
    return df_style._repr_html_()

df_2_html_table = get_html_table(df_2, 'Data from Google Sheet')
df_4_html_table = get_html_table(df_4, 'Data from Jira')
ipyw.HBox((ipyw.HTML(df_2_html_table),ipyw.HTML(df_4_html_table)))

2

গিব্বনের উত্তর আমার পক্ষে কাজ করেছে! আপনি যদি টেবিলগুলির মধ্যে অতিরিক্ত স্থান চান তবে তিনি প্রস্তাবিত কোডটিতে যান এবং "\xa0\xa0\xa0"এটি নিম্নলিখিত কোড লাইনে যুক্ত করুন।

display_html(df1_styler._repr_html_()+"\xa0\xa0\xa0"+df2_styler._repr_html_(), raw=True)

2

আমি ইয়াসিনের মার্জিত উত্তরে কিছু অতিরিক্ত কার্যকারিতা যুক্ত করার সিদ্ধান্ত নিয়েছি, যেখানে কেউ কলস এবং সারি উভয়ই বেছে নিতে পারে ; যে কোনও অতিরিক্ত dfs এর পরে নীচে যুক্ত করা হয়। অতিরিক্তভাবে গ্রিড পূরণ করার জন্য যে কোনওটি চয়ন করতে পারেন (কেবল পূরণের কীওয়ার্ডটি 'কলস' বা 'সারিগুলিতে প্রয়োজন অনুসারে পরিবর্তন করুন)

import pandas as pd
from IPython.display import display,HTML

def grid_df_display(list_dfs, rows = 2, cols=3, fill = 'cols'):
    html_table = "<table style='width:100%; border:0px'>{content}</table>"
    html_row = "<tr style='border:0px'>{content}</tr>"
    html_cell = "<td style='width:{width}%;vertical-align:top;border:0px'>{{content}}</td>"
    html_cell = html_cell.format(width=100/cols)

    cells = [ html_cell.format(content=df.to_html()) for df in list_dfs[:rows*cols] ]
    cells += cols * [html_cell.format(content="")] # pad

    if fill == 'rows': #fill in rows first (first row: 0,1,2,... col-1)
        grid = [ html_row.format(content="".join(cells[i:i+cols])) for i in range(0,rows*cols,cols)]

    if fill == 'cols': #fill columns first (first column: 0,1,2,..., rows-1)
        grid = [ html_row.format(content="".join(cells[i:rows*cols:rows])) for i in range(0,rows)]

    display(HTML(html_table.format(content="".join(grid))))

    #add extra dfs to bottom
    [display(list_dfs[i]) for i in range(rows*cols,len(list_dfs))]

list_dfs = []
list_dfs.extend((pd.DataFrame(2*[{"x":"hello"}]), 
             pd.DataFrame(2*[{"x":"world"}]), 
             pd.DataFrame(2*[{"x":"gdbye"}])))

grid_df_display(3*list_dfs)

পরীক্ষা আউটপুট


1

@ জারাক কোডটি বেশ ছোট তবে পুরো নোটবুকের বিন্যাসকে প্রভাবিত করে। অন্যান্য বিকল্পগুলি আমার জন্য কিছুটা অগোছালো।

আমি এই কিছু স্পষ্ট সিএসএস জুড়েছেন উত্তর শুধুমাত্র বর্তমান ঘরের আউটপুট ক্ষতিগ্রস্ত করেছে। এছাড়াও আপনি ডেটা ফ্রেমের নীচে বা উপরে কিছু যুক্ত করতে সক্ষম।

from ipywidgets import widgets, Layout
from IPython import display
import pandas as pd
import numpy as np

# sample data
df1 = pd.DataFrame(np.random.randn(8, 3))
df2 = pd.DataFrame(np.random.randn(8, 3))

# create output widgets
widget1 = widgets.Output()
widget2 = widgets.Output()

# render in output widgets
with widget1:
    display.display(df1.style.set_caption('First dataframe'))
    df1.info()
with widget2:
    display.display(df2.style.set_caption('Second dataframe'))
    df1.info()


# add some CSS styles to distribute free space
box_layout = Layout(display='flex',
                    flex_flow='row',
                    justify_content='space-around',
                    width='auto'
                   )
    
# create Horisontal Box container
hbox = widgets.HBox([widget1, widget2], layout=box_layout)

# render hbox
hbox

এখানে চিত্র বর্ণনা লিখুন


0

অ্যান্টোনির উত্তরের বর্ধন আপনি যদি সারণিতে কয়েকটি সংখ্যক ব্লকের টেবিলগুলির ডি ভিজ্যুয়ালাইজেশন সীমাবদ্ধ করতে চান তবে সর্বাধিক টেবিলের ভেরিয়েবলটি ব্যবহার করুন।এখানে চিত্র বর্ণনা লিখুন

def mydisplay(dfs, names=[]):

    count = 0
    maxTables = 6

    if not names:
        names = [x for x in range(len(dfs))]

    html_str = ''
    html_th = ''
    html_td = ''

    for df, name in zip(dfs, names):
        if count <= (maxTables):
            html_th += (''.join(f'<th style="text-align:center">{name}</th>'))
            html_td += (''.join(f'<td style="vertical-align:top"> {df.to_html(index=False)}</td>'))
            count += 1
        else:
            html_str += f'<tr>{html_th}</tr><tr>{html_td}</tr>'
            html_th = f'<th style="text-align:center">{name}</th>'
            html_td = f'<td style="vertical-align:top"> {df.to_html(index=False)}</td>'
            count = 0


    if count != 0:
        html_str += f'<tr>{html_th}</tr><tr>{html_td}</tr>'


    html_str += f'<table>{html_str}</table>'
    html_str = html_str.replace('table','table style="display:inline"')
    display_html(html_str, raw=True)

মাল্টি ইনডেক্সড ডেটাফ্রেমে প্রয়োগ করার পরে এটি বহু সূচীগুলি হারাবে
পার্থিবান রাজেন্দ্রন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.