Pandas风格`.render()`--显示前后的不同值

问题描述 投票:1回答:1

我试图在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)

结果输出如下: enter image description here

下面的调用:

display_multi_table(tables, True)

结果是这样的输出:enter image description here

我的目标是:实现第二张截图底部的输出,而不需要调用... display.

我试过的东西都检查过了。

  • 如果我不给pandas的数据框架设置样式,而只是简单地调用。.to_html() 而不是在数据帧上调用 .render() 在样式器上,这个问题不存在。然而,我需要在样式数据框架上工作。
  • 我已经确认了由 table.render() 呼叫前后 display 确实是不同的。
python html pandas styles
1个回答
3
投票

试着把你的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_displayFalse.


2
投票

不是真正的答案,但还是有一些信息。我无法重现这个问题,我已经有了想要的输出。可能是由于某些包的版本问题?我用的是pandas 1.0.3和IPython 7.13.0。

enter image description here


0
投票

为了方便贴图,我把我解决这个问题的方法贴出来。

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但它的工作...

© www.soinside.com 2019 - 2024. All rights reserved.