Pandas Dataframes to_html:突出显示表格行
Posted
技术标签:
【中文标题】Pandas Dataframes to_html:突出显示表格行【英文标题】:Pandas Dataframes to_html: Highlighting table rows 【发布时间】:2013-08-08 10:30:23 【问题描述】:我正在使用 pandas to_html 函数创建表格,并且我希望能够突出显示输出表格的底行,该表格的长度是可变的。我没有任何真正的html经验可言,我在网上找到的都是这个
<table border="1">
<tr style="background-color:#FF0000">
<th>Month</th>
<th>Savings</th>
</tr>
<tr>
<td>January</td>
<td>$100</td>
</tr>
</table>
所以我知道最后一行必须有<tr style=""background-color:#FF0000">
(或我想要的任何颜色)而不仅仅是<tr>
,但我真的不知道该怎么做就是让我的表格发生这种情况米制作。我不认为我可以使用 to_html 函数本身来做到这一点,但是在创建表之后我该怎么做呢?
感谢任何帮助。
【问题讨论】:
【参考方案1】:您可以使用 jQuery 在 javascript 中完成:
$('table tbody tr').filter(':last').css('background-color', '#FF0000')
此外,较新版本的 pandas 将 dataframe
类添加到表 html 中,以便您可以使用以下方法仅过滤掉 pandas 表:
$('table.dataframe tbody tr').filter(':last').css('background-color', '#FF0000')
但您可以根据需要添加自己的类:
df.to_html(classes='my_class')
甚至多个:
df.to_html(classes=['my_class', 'my_other_class'])
如果您使用的是 IPython Notebook,这里是完整的工作示例:
In [1]: import numpy as np
import pandas as pd
from IPython.display import HTML, Javascript
In [2]: df = pd.DataFrame('a': np.arange(10), 'b': np.random.randn(10))
In [3]: HTML(df.to_html(classes='my_class'))
In [4]: Javascript('''$('.my_class tbody tr').filter(':last')
.css('background-color', '#FF0000');
''')
或者你甚至可以使用纯 CSS:
In [5]: HTML('''
<style>
.df tbody tr:last-child background-color: #FF0000;
</style>
''' + df.to_html(classes='df'))
可能性是无限的:)
编辑:创建一个 html 文件
import numpy as np
import pandas as pd
HEADER = '''
<html>
<head>
<style>
.df tbody tr:last-child background-color: #FF0000;
</style>
</head>
<body>
'''
FOOTER = '''
</body>
</html>
'''
df = pd.DataFrame('a': np.arange(10), 'b': np.random.randn(10))
with open('test.html', 'w') as f:
f.write(HEADER)
f.write(df.to_html(classes='df'))
f.write(FOOTER)
【讨论】:
虽然我认为您的回答对于有一些 HTML/JS/CSS 经验的人来说非常棒,但我认为没有 HTML 经验的人会觉得您的解决方案有点不知所措。 一点点......我不明白在这里创建一个类是做什么的。我正在使用 python 2.7.5(包含 python (x,y) 包中的所有包),并从命令提示符运行文件。我在 IPython 中运行您的示例并获得last-child
选择器无法使用它。您必须使用 ipython 笔记本才能完全操作 html 输出。
更新示例,添加从数据框创建 html 文件,添加样式。【参考方案2】:
由于 pandas 现在具有样式功能,您不再需要 JavaScript hack。 这是一个纯粹的 pandas 解决方案:
import pandas as pd
df = []
df.append(dict(date='2016-04-01', sleep=11.2, calories=2740))
df.append(dict(date='2016-04-02', sleep=7.3, calories=3600))
df.append(dict(date='2016-04-03', sleep=8.3, calories=3500))
df = pd.DataFrame(df)
def highlight_last_row(s):
return ['background-color: #FF0000' if i==len(s)-1 else '' for i in range(len(s))]
s = df.style.apply(highlight_last_row)
【讨论】:
当我们在浏览器(Web 应用程序的客户端)上显示它时,这行得通吗?此外,当我们向最终用户显示时,是否可以删除最左列的 0、1、2 等。谢谢! 您可以使用df.to_html(index = False)
。【参考方案3】:
我无法让@Viktor 的“完整工作示例”在 ipython (jupyter) 中工作,因为最后一行是要渲染的,但是在 Javascript 行之后移动 HTML 渲染对我不起作用。
“纯 CSS”示例确实有效,我们甚至可以在其中放置 Javascript <script>
。这使我可以使用 https://github.com/christianbach/tablesorter 呈现可排序的 Pandas 数据框。
这是一个完整的例子:
df = pd.DataFrame('a': np.arange(10), 'b': np.random.randn(10))
from IPython.display import HTML, Javascript
HTML('''<script src='./tablesort/tablesort.min.js'></script>
<script src='./tablesort/src/sorts/tablesort.number.js'></script>
<script>
new Tablesort(document.getElementById('sort'));
</script>
'''+ df.to_html(classes ='sort" id = "sort'))
请注意,.js 文件是本地文件。直接引用 github 原始代码将不起作用,因为 MIME 类型是 plain/txt 。
更新:我刚刚注意到 Pandas v0.17.1 向add style to the DataFrame HTML output 发布了一项功能。
【讨论】:
以上是关于Pandas Dataframes to_html:突出显示表格行的主要内容,如果未能解决你的问题,请参考以下文章
`pandas.DataFrame.to_html()` 没有 `table border` 和 `tr style`
Python Pandas to_html 无法打印 utf-8 字符
如何使用 Pandas to_html 将相同的 html bg 颜色应用于所有列
使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列