我正在尝试格式化表格,以便每列中的数据根据它们的值以某种样式格式化(类似于电子表格程序中的条件格式)。如何使用 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 类附加到<td>
HTML 输出中的标记,然后可以使用 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)