我试图在Jupyter笔记本中水平显示几个pandas数据框,但遇到了一个情况,即样式器的HTML格式不正确。
我有以下代码片段。
import numpy as np
import pandas as pd
from IPython.display import display, HTML
def display_multi_table(table_list, with_display):
if with_display:
for t in table_list: display(t)
return HTML(
'<table><tr style="background-color:white;">' +
''.join(['<td style="height:300px;width:300px">' + table.render() + '</td>' for table in table_list]) +
'</tr></table>'
)
d = dict([(f"column_{i}", np.random.rand(5)) for i in range(3)])
tables = [pd.DataFrame(d).style.set_caption("Title") for i in range(3)]
以下调用:
display_multi_table(tables, False)
下面的调用:
display_multi_table(tables, True)
我的目标是:实现第二张截图底部的输出,而不需要调用... display
.
我试过的东西都检查过了。
.to_html()
而不是在数据帧上调用 .render()
在样式器上,这个问题不存在。然而,我需要在样式数据框架上工作。table.render()
呼叫前后 display
确实是不同的。试着把你的html传递到display中,而不是在每个表上单独调用display()。
import numpy as np
import pandas as pd
from IPython.display import display, HTML
def display_multi_table(table_list, with_display):
html = HTML(
'<table><tr style="background-color:white;">' +
''.join(['<td style="height:300px;width:300px">' + table.render() + '</td>' for table in table_list]) +
'</tr></table>'
)
if with_display:
display(html)
return html
注意,如果你调用 display_multi_table(tables, True)
在jupyter单元格的末尾,不将其设置为任何值,它将有效地显示两次表格--一次是从 display(html)
,还有一次是从你的函数的返回值(return html
). 如果这是不可取的行为,那么只要将函数调用设置为等于一个变量,(html = display_multi_table(tables, True)
),或设置 with_display
到 False
.
为了方便贴图,我把我解决这个问题的方法贴出来。
from IPython.display import display, HTML, clear_output
# source https://github.com/epmoyer/ipy_table/issues/24
def display_multi_table(table_list):
for t in table_list:
display(t)
clear_output(wait=True)
html = HTML('<table><tr style="background-color:white;">' + ''.join([
'<td style="black;height:500px;width:600px">' + table.render() + '</td>'
for table in table_list
]) + '</tr></table>')
return html
我不知道为什么我需要使用... ... clear_output
但它的工作...