将样式应用于保存到 HTML 文件的 Pandas 数据框

Posted

技术标签:

【中文标题】将样式应用于保存到 HTML 文件的 Pandas 数据框【英文标题】:Applying styling to Pandas dataframe saved to HTML file 【发布时间】:2018-05-22 02:44:17 【问题描述】:

我在 Jupyter / IPython 笔记本中有一个 Pandas 数据框。作为 Jupyter 中的 html 表格的数据框样式非常好。表头行加粗,字体美观,表格边框细。

然后我将数据框导出到 HTML 文件(按照说明 here 和 here):

df.to_html('myfile.html')

但是生成的 HTML 文件的表格样式不好。

该文件中的 HTML 是普通的:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Id</th>
      <th>Index</th>
      <th>Feature</th>
      <th>Timestamp</th>
      <th>Feature2</th>
    </tr>
  </thead>

如何直接从我的 Python/Pandas 代码修改此导出表的样式?

【问题讨论】:

您可以创建带有类和pass them to the method的自定义样式表 @J.C.Rocamonde:因为我花了过去 24 小时来创建解决方案,所以我想我会分享结果。 是的,你说得对,哈哈,我不是故意无礼的,只是说这实际上不是问题,只是完成它的问题 可能有一个更简单或更优雅的解决方案,问对@***user2010 会不会有什么坏处? 感谢您发布您的答案伙伴。这很有帮助。 【参考方案1】:

我编写了一个 Python 函数,它基本上将 HTML &lt;style&gt; 添加到数据框的 HTML 表示中,以便生成的 HTML 表格看起来不错。

import pandas as pd

def write_to_html_file(df, title='', filename='out.html'):
    '''
    Write an entire dataframe to an HTML file with nice formatting.
    '''

    result = '''
<html>
<head>
<style>

    h2 
        text-align: center;
        font-family: Helvetica, Arial, sans-serif;
    
    table  
        margin-left: auto;
        margin-right: auto;
    
    table, th, td 
        border: 1px solid black;
        border-collapse: collapse;
    
    th, td 
        padding: 5px;
        text-align: center;
        font-family: Helvetica, Arial, sans-serif;
        font-size: 90%;
    
    table tbody tr:hover 
        background-color: #dddddd;
    
    .wide 
        width: 90%; 
    

</style>
</head>
<body>
    '''
    result += '<h2> %s </h2>\n' % title
    if type(df) == pd.io.formats.style.Styler:
        result += df.render()
    else:
        result += df.to_html(classes='wide', escape=False)
    result += '''
</body>
</html>
'''
    with open(filename, 'w') as f:
        f.write(result)

这是您将其写入 .html 文件时生成的 HTML。请注意数据框的 to_html() 输出如何适合中间。

以下是我的函数的一些示例用法。我首先从sklearn 加载一个数据集来演示。

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
data1 = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
                     columns=iris['feature_names'] + ['target'])
data1.head()

在 Jupyter / IPython Notebook 中,表格看起来很漂亮:

我可以使用通常的to_html() 函数将数据帧写入 HTML 文件,如下所示:

data1.to_html('iris.html')

但是,结果看起来不太好,如下图。边框很粗,字体也不好看,因为这只是一个没有样式的&lt;table&gt; ... &lt;/table&gt;

为了让数据框在 HTML 中看起来更好,我使用了上面的函数。

write_to_html_file(data1, 'Iris data set', 'iris2.html')

现在表格看起来好多了,因为我应用了样式。我还添加了行高亮。

【讨论】:

这种样式在少数电子邮件客户端(例如 Gmail)中不起作用。虽然它适用于 Safari。有几个电子邮件客户端不希望在标题中使用样式但需要内联 css。 有没有办法在方法中包含条件?例如如果值为负,则将列设为红色,否则设为绿色。 @guy,转到here 并启动会话。您会在页面底部看到我将类似此解决方案的内容与conditional formatting using Pandas' styling 功能结合起来,根据值对单元格进行着色。

以上是关于将样式应用于保存到 HTML 文件的 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 HTML 标记删除应用于 Pandas 列

SASS 将样式应用于整个网站,尽管仅导入到单个页面中

Pandas DataFrame 保存到HTML文件(附炫酷 HTML Table 模板网站)

Pandas DataFrame 保存到HTML文件(附炫酷 HTML Table 模板网站)

将样式应用于 Angular 2 中动态创建的元素

如何将 MDL 按钮样式应用于文件选择器?