Pandas Styler и float_format

Рассмотрим пример:

import pandas as pd

pd.options.display.float_format = '{:,.3f}'.format

df = pd.DataFrame.from_dict(dict(name=['a', 'b', 'c'], value=[1.1234,2.123332,3.232433]))
print(df)

df = df.style.apply(lambda x: ['background: lightgreen' if (x.name == 1) else '' for i in x], axis=1)
print(df.to_html())

HTML-вывод:

<style type = "text/css">
#T_fa0b6_row1_col0, #T_fa0b6_row1_col1 {
  background: lightgreen;
}
</style>
<table id = "T_fa0b6">
  <thead>
    <tr>
      <th class = "blank level0" >&nbsp;</th>
      <th id = "T_fa0b6_level0_col0" class = "col_heading level0 col0" >name</th>
      <th id = "T_fa0b6_level0_col1" class = "col_heading level0 col1" >value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th id = "T_fa0b6_level0_row0" class = "row_heading level0 row0" >0</th>
      <td id = "T_fa0b6_row0_col0" class = "data row0 col0" >a</td>
      <td id = "T_fa0b6_row0_col1" class = "data row0 col1" >1.123400</td>
    </tr>
    <tr>
      <th id = "T_fa0b6_level0_row1" class = "row_heading level0 row1" >1</th>
      <td id = "T_fa0b6_row1_col0" class = "data row1 col0" >b</td>
      <td id = "T_fa0b6_row1_col1" class = "data row1 col1" >2.123332</td>
    </tr>
    <tr>
      <th id = "T_fa0b6_level0_row2" class = "row_heading level0 row2" >2</th>
      <td id = "T_fa0b6_row2_col0" class = "data row2 col0" >c</td>
      <td id = "T_fa0b6_row2_col1" class = "data row2 col1" >3.232433</td>
    </tr>
  </tbody>
</table>

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

Я создаю фрейм данных, в котором есть строка «Всего». Я хотел бы, чтобы эта строка была выделена только. Я выгружаю это в HTML, а затем запускаю weasyprint для создания PDF. У меня будет много таблиц в моем PDF. Может быть, лучше создать специальный класс CSS, который выполняет эту стилизацию, но как мне назначить класс CSS только для одной строки в фрейме данных?

1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что вывод стилизатора отличается от вывода остальных панд, поэтому я думаю, что он не учитывает pd.options. Вместо этого вы можете использовать format метод Styler объектов.

Вы можете указать точность напрямую:

style = df.style.apply(lambda x: ['background: lightgreen' if (x.name == 1) else '' for i in x], axis=1)
style = style.format(precision=3)

Или укажите пользовательский форматтер:

formatter = {
    'value': '{:,.3f}'.format  # same as lambda x: '{:,.3f}'.format(x)
}
style = style.format(formatter=formatter)

Выход:

>>> print(style.to_html())
<style type = "text/css">
#T_95068_row1_col0, #T_95068_row1_col1 {
  background: lightgreen;
}
</style>
<table id = "T_95068_">
  <thead>
    <tr>
      <th class = "blank level0" >&nbsp;</th>
      <th class = "col_heading level0 col0" >name</th>
      <th class = "col_heading level0 col1" >value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th id = "T_95068_level0_row0" class = "row_heading level0 row0" >0</th>
      <td id = "T_95068_row0_col0" class = "data row0 col0" >a</td>
      <td id = "T_95068_row0_col1" class = "data row0 col1" >1.123</td>
    </tr>
    <tr>
      <th id = "T_95068_level0_row1" class = "row_heading level0 row1" >1</th>
      <td id = "T_95068_row1_col0" class = "data row1 col0" >b</td>
      <td id = "T_95068_row1_col1" class = "data row1 col1" >2.123</td>
    </tr>
    <tr>
      <th id = "T_95068_level0_row2" class = "row_heading level0 row2" >2</th>
      <td id = "T_95068_row2_col0" class = "data row2 col0" >c</td>
      <td id = "T_95068_row2_col1" class = "data row2 col1" >3.232</td>
    </tr>
  </tbody>
</table>

Обратите внимание на 3-значную точность в приведенном выше примере.

styler имеет свою собственную опцию панд: pd.options.styler.format.precision

Attack68 18.03.2022 07:27

Другие вопросы по теме