tutorial hist example espaƱol pandas ipython-notebook jupyter-notebook

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)



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