Подтвердить что ты не робот

Pandas: вывод HTML с условным форматированием

Я пытаюсь отформатировать таблицу, так что данные в каждом столбце форматируются в стиле в зависимости от их значений (аналогично условному форматированию в программах электронных таблиц). Как я могу достичь этого в pandas с помощью форматирования HTML?

Типичным примером использования является выделение значительных значений в таблице. Например:

    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)
4b9b3361

Ответ 1

Вы можете использовать метод DataFrame to_html, который поставляется с аргументом formatters.

Более простым решением будет окружение <span class="significant"> и </span>, а не *). Примечание: по умолчанию это будет экранировано (т.е. < станет &lt;), поэтому вам нужно будет использовать аргумент escape=False.