pandy: wyjście HTML z formatowaniem warunkowym
Próbuję sformatować tabelę, tak aby dane w każdej kolumnie były formatowane w stylu zależnym od ich wartości (podobnie jak formatowanie warunkowe w programach arkusza kalkulacyjnego). Jak mogę to osiągnąć w pandach przy użyciu formatera HTML?
Typowy przypadek użycia to podświetlanie znaczących wartości w tabeli. Na przykład:
correlation p-value
0 0.5 0.1
1 0.1 0.8
2 0.9 *0.01*
pandy pozwalają zdefiniować niestandardowe formatyzatory dla wyjścia HTML - aby uzyskać powyższe wyjście można użyć:
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)
Chciałbym jednak zmienić styl znaczących wartości (na przykład za pomocą pogrubionej czcionki).
Możliwym rozwiązaniem byłoby dołączenie klasy CSS do<td>
znaczniki w wyjściu HTML, które można następnie sformatować przy użyciu arkusza stylów CSS. Powyższe stanie się wtedy:
<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>
Edytować: Jak sugeruje @ Andy-Hayden, mogę dodać formatowanie, po prostu zastępując gwiazdki gwiazdką<span class="signifcant">...</span>
w moim przykładzie:
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})
Nowsze wersje pand uciekają ze znaczników. Aby tego uniknąć, zastąp ostatnią linię:
df.to_html(buf, formatters={'p_value': significant}, escape=False)