pandas:带有条件格式的 HTML 输出
Posted
技术标签:
【中文标题】pandas:带有条件格式的 HTML 输出【英文标题】:pandas: HTML output with conditional formatting 【发布时间】:2013-01-15 15:34:06 【问题描述】:我正在尝试格式化表格,以便每列中的数据根据其值以某种样式格式化(类似于电子表格程序中的条件格式化)。如何使用 html 格式化程序在 pandas 中实现这一点?
一个典型的用例是突出显示表格中的重要值。例如:
correlation p-value
0 0.5 0.1
1 0.1 0.8
2 0.9 *0.01*
pandas 允许为 HTML 输出定义自定义格式化程序 - 以获得可以使用的上述输出:
import pandas as pd
from pandas.core import format
from StringIO import StringIO
buf = StringIO()
df = pd.DataFrame('correlation':[0.5, 0.1,0.9], 'p_value':[0.1,0.8,0.01])
fmt = format.DataFrameFormatter(df,
formatters='p_value':lambda x: "*%f*" % x if x<0.05 else str(x))
format.HTMLFormatter(fmt).write_result(buf)
但是,我想更改重要值的样式(例如,使用粗体)。
一种可能的解决方案是将 CSS 类附加到 HTML 输出中的 <td>
标记,然后可以使用 CSS 样式表对其进行格式化。上面会变成:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>correlation</th>
<th>p_value</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td> 0.5</td>
<td> 0.10</td>
</tr>
<tr>
<td>1</td>
<td> 0.1</td>
<td> 0.80</td>
</tr>
<tr>
<td>2</td>
<td> 0.9</td>
<td class='significant'> 0.01</td>
</tr>
</tbody>
</table>
编辑:正如@Andy-Hayden 所建议的,在我的示例中,我可以通过简单地将星号替换为<span class="signifcant">...</span>
来添加格式:
import pandas as pd
from StringIO import StringIO
buf = StringIO()
significant = lambda x: '<span class="significant">%f</span>' % x if x<0.05 else str(x)
df = pd.DataFrame('correlation':[0.5, 0.1,0.9], 'p_value':[0.1,0.8,0.01])
df.to_html(buf, formatters='p_value': significant)
较新版本的 pandas 会避开这些标签。为避免将最后一行替换为:
df.to_html(buf, formatters='p_value': significant, escape=False)
【问题讨论】:
我可以使用to_html和格式化程序将buf的值直接写入html文件吗? 【参考方案1】:从 pandas 0.17.1 开始,很容易应用自定义格式 使用 styling api.
import pandas as pd
df = pd.DataFrame(
'correlation':[0.5, 0.1,0.9],
'p_value':[0.1,0.8,0.01])
styled_df = df.style.apply(
lambda x: ['font-weight: bold; background-color: yellow'
if value <= 0.01 else '' for value in x])
styled_df
输出在 Jupyter Notebook 等界面中自动呈现
并且可以使用render()
返回 HTML 的字符串表示形式
方法。
print(styled_df.render())
<style type="text/css" >
#T_4e49b9da_8451_11e8_9166_605718a99a7frow2_col1
font-weight: bold;
background-color: yellow;
font-weight: bold;
background-color: yellow;
</style>
<table id="T_4e49b9da_8451_11e8_9166_605718a99a7f" >
<thead> <tr>
<th class="blank level0" ></th>
<th class="col_heading level0 col0" >correlation</th>
<th class="col_heading level0 col1" >p_value</th>
</tr></thead>
<tbody> <tr>
<th id="T_4e49b9da_8451_11e8_9166_605718a99a7flevel0_row0" class="row_heading level0 row0" >0</th>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow0_col0" class="data row0 col0" >0.5</td>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow0_col1" class="data row0 col1" >0.1</td>
</tr> <tr>
<th id="T_4e49b9da_8451_11e8_9166_605718a99a7flevel0_row1" class="row_heading level0 row1" >1</th>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow1_col0" class="data row1 col0" >0.1</td>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow1_col1" class="data row1 col1" >0.8</td>
</tr> <tr>
<th id="T_4e49b9da_8451_11e8_9166_605718a99a7flevel0_row2" class="row_heading level0 row2" >2</th>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow2_col0" class="data row2 col0" >0.9</td>
<td id="T_4e49b9da_8451_11e8_9166_605718a99a7frow2_col1" class="data row2 col1" >0.01</td>
</tr></tbody>
</table>
【讨论】:
【参考方案2】:您可以使用带有formatters
参数的DataFrame to_html
方法。
更简单的解决方案是用<span class="significant">
和</span>
(而不是*
)包围。注意:默认情况下,这将被转义(即&lt;
变为&lt;
),因此您需要使用escape=False
参数。
【讨论】:
这是个好主意,谢谢!我基本上将上面示例代码中的星星替换为<span class...>
。重要性根据p-value
列中的值确定。
由于span
标记被转义,这不能按预期工作:<td>&lt;span class='significant'&gt; ...
@PhE 你现在必须传入 escape=False 才能完成这项工作。 :)以上是关于pandas:带有条件格式的 HTML 输出的主要内容,如果未能解决你的问题,请参考以下文章
Pandas_设置单元格条件格式1——指定值字体变色指定值设置背景色
Pandas_设置单元格条件格式2——迷你条形图用颜色深浅表示值大小
在Excel中,需要计算从条件格式中着色的单元格,然后创建特定结果的报告