hist - El cuaderno Jupyter muestra dos mesas pandas juntas
pandas.dataframe.hist example (9)
¡La respuesta de Gibbone funcionó para mí!
Si desea espacio adicional entre las tablas, vaya al código que propuso y agregue este
"/xa0/xa0/xa0"
a la siguiente línea de código.
display_html(df1_styler._repr_html_()+"/xa0/xa0/xa0"+df2_styler._repr_html_(), raw=True)
Tengo dos marcos de datos de pandas y me gustaría mostrarlos en el cuaderno Jupyter.
Haciendo algo como:
display(df1)
display(df2)
Les muestra uno debajo del otro:
Me gustaría tener un segundo marco de datos a la derecha del primero. Hay una pregunta similar , pero parece que una persona está satisfecha con fusionarlos en un marco de datos para mostrar la diferencia entre ellos.
Esto no funcionará para mí. En mi caso, los marcos de datos pueden representar completamente diferentes (elementos no comparables) y su tamaño puede ser diferente. Por lo tanto, mi objetivo principal es ahorrar espacio.
A partir de
pandas 0.17.1
la visualización de DataFrames se puede modificar directamente con los
métodos de diseño de pandas
Para mostrar dos DataFrames uno al lado del otro, debe usar
set_table_attributes
con el argumento
"style=''display:inline''"
como se sugiere en la
respuesta ntg
.
Esto devolverá dos objetos
Styler
.
Para mostrar los marcos de datos alineados, simplemente pase su representación HTML unida a través del método
display_html
de IPython.
Con este método también es más fácil agregar otras opciones de estilo. Aquí se explica cómo agregar un título, como se solicita here :
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(''Table 1'')
df2_styler = df2.style.set_table_attributes("style=''display:inline''").set_caption(''Table 2'')
display_html(df1_styler._repr_html_()+df2_styler._repr_html_(), raw=True)
Aquí está la solución de Jake Vanderplas que encontré el otro día:
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)
Combinando enfoques de gibbone (para establecer estilos y subtítulos) y stevi (agregando espacio) hice mi versión de la función, que genera cuadros de datos de pandas como tablas de lado a lado:
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)
Uso:
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)))
Salida:
Esto agrega encabezados a la respuesta de @ nts:
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)
Mi solución solo construye una tabla en HTML sin ningún hack CSS y la genera:
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)
Puede anular el CSS del código de salida.
Utiliza
flex-direction: column
por defecto.
Intente cambiarlo a
row
lugar.
Aquí hay un ejemplo:
import pandas as pd
import numpy as np
from IPython.display import display, HTML
CSS = """
.output {
flex-direction: row;
}
"""
HTML(''<style>{}</style>''.format(CSS))
Por supuesto, puede personalizar el CSS aún más como lo desee.
Si desea apuntar solo a la salida de una celda, intente usar el selector
:nth-child()
.
Por ejemplo, este código modificará el CSS de la salida de solo la quinta celda del cuaderno:
CSS = """
div.cell:nth-child(5) .output {
flex-direction: row;
}
"""
Terminé escribiendo una función que puede hacer esto:
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)
Ejemplo de uso:
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)
Terminé usando 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)))