Жирный столбец в пандах DataFrame to_html - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь вернуть df.to_html () с одним полужирным столбцом. Я только попробовал

df = pd.DataFrame({'important_column': [1,2,3,4], 
                   'dummy_column': [5,6,7,8]})

def some_function()
      df.apply(lambda x: '<b>' + str(df['important_column']) + '</b>', axis=1)
      return [df.to_html()]

Но, похоже, это не работает. Кто-нибудь знает практическое решение?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Вы можете использовать df.style.set_properties, а затем .render(), который будет префикс нормального вывода таблицы из .to_html() с соответствующим элементом style. (обратите внимание, что это физически не оборачивает ваши текстовые элементы внутри <b> или <strong> или любых других тегов, которые вы хотите, но просто обеспечивает стилизацию для этих ячеек - что может или не может быть тем, что вы хотите в зависимости от варианта использования)

html = df.style.set_properties(
    subset=['important_column'], 
    **{'font-weight': 'bold'}
).render()

(пример показан в блокноте jupyter)

enter image description here

0 голосов
/ 31 августа 2018

Это была моя ошибка, что я не обратился к вопросу должным образом, мне нужно иметь df.to_html () в конце функции, потому что этот html отображается на веб-странице, созданной с помощью flask, поэтому не вышеуказанная работа для меня.

Я нашел дешевую работу вокруг, которая соответствует моим потребностям:

def some_function():
    df['important_column'] = '^' + df['important_column'].astype(str) + '+'
    return [df.to_html(classes='greenARTstyle').replace('^', '<b>').replace('+', '</b>')]
0 голосов
/ 31 августа 2018

Вы забыли назначить вывод, но более быстрое векторизованное решение - преобразовать столбец в строку и добавить строки без apply с f строками:

def some_function():

    df['important_column'] = [f'<b>{x}</b>' for x in df['important_column']]
    #alternative1 
    df['important_column'] =  '<b>' + df['important_column'].astype(str) + '</b>'
    #alternative2
    #df['important_column'] = df['important_column'].apply(lambda x: '<b>' + str(x) + '</b>')
    #alternative3, thanks @Jon Clements
    #df['important_column'] = df['important_column'].apply('<b>{}</b>?'.format)
    return df.to_html()

EDIT:

df['important_column'] = [f'<b>{x}</b>' for x in df['important_column']]
print (df.to_html(escape=False))
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>important_column</th>
      <th>dummy_column</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td><b>1</b></td>
      <td>5</td>
    </tr>
    <tr>
      <th>1</th>
      <td><b>2</b></td>
      <td>6</td>
    </tr>
    <tr>
      <th>2</th>
      <td><b>3</b></td>
      <td>7</td>
    </tr>
    <tr>
      <th>3</th>
      <td><b>4</b></td>
      <td>8</td>
    </tr>
  </tbody>
</table>

Задержка

df = pd.DataFrame({'important_column': [1,2,3,4], 
                   'dummy_column': [5,6,7,8]})

df = pd.concat([df] * 10000, ignore_index=True)

In [213]: %timeit df['important_column'] = [f'<b>{x}</b>' for x in df['important_column']]
74 ms ± 22.2 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [214]: %timeit df['important_column'] = df['important_column'].apply(lambda x: '<b>' + str(x) + '</b>')
150 ms ± 7.75 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [216]: %timeit df['important_column'].apply('<b>{}</b>?'.format)
133 ms ± 238 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [217]: %timeit '<b>' + df['important_column'].astype(str) + '</b>'
266 ms ± 1.21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...