Форматировать данные в формате pandas по строкам - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующий фрейм данных, и я хочу преобразовать его в HTML

            Limit        Status     Warning      3M AVG
VAR1        1.20         1.21216    1.11         1.21235
VAR2        0.82         0.63075    0.75         0.593295
VAR3        0.38         0.376988   0.35         0.376988
VAR4        0.17         0.126987   0.14         0.12461

Я хочу отформатировать этот фрейм данных построчно, чтобы:

  1. Если Status превышаетWarning вся строка становится подсвеченной желтым, и если она превышает Limit, вся строка становится подсвеченной красным
  2. строка VAR2 и VAR3 имеют формат "{: .2%}" и VAR1и VAR4 имеют "{: .2f}"

Я копался в документации для панд и попробовал несколько методов, но не смог выполнить все вышеперечисленные задачи

Я был бы признателен, если бы вы могли помочь, так как я считаю, что для многих пользователей панд сложно отформатировать строку данных.

Редактировать 1: Я попробовал следующий код:

df=df.transpose()    
df.style.format("{:.2%}").format({"VAR1":"{:.2f},"VAR4":"{:.2f}"})

Примечание: транспонируя фрейм данных, гораздо проще выполнять все задачи, но я не могу его транспонироватьвернуться к своей первоначальной форме, потому что это стайлер.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

У меня была такая же проблема, я посмотрел на реализацию функции format в классе pandas.io.formats.style.Styler и реализовал похожую построчную функцию:

def format_row_wise(styler, formatter):
    for row, row_formatter in formatter.items():
        row_num = styler.index.get_loc(row)

        for col_num in range(len(styler.columns)):
            styler._display_funcs[(row_num, col_num)] = row_formatter
    return styler

Пример :

df = pandas.DataFrame(
    {
        'Limit': [1.20, 0.82, 0.38, 0.17], 
        'Status': [1.21216, 0.63075, 0.376988, 0.126987], 
        'Warning': [1.11, 0.75, 0.35, 0.14], 
        '3M AVG': [1.21235, 0.593259, 0.376988, 0.12461]
    }, 
    index=['VAR1', 'VAR2', 'VAR3', 'VAR4']
)
formatters = {"VAR1":lambda x: f"{x:.2f}", "VAR4": lambda x: f"{x:.2f}"}
styler = format_row_wise(df.style, formatters)
styler.render()

Это работает для меня:)

Примечание :

  • Я реализовал только форматирование dict!
  • Формат должен быть задан как функция (здесь: лямбда)

Надеюсь, это поможет вам выбрать правильный путь ...

0 голосов
/ 12 октября 2018

Я думаю, что вы можете делать то, что вы хотите, с помощью пользовательской функции Styling :

def color(row):
    if row.Status >= row.Limit:
        return ['background-color: red'] * len(row)
    elif row.Status >= row.Warning:
        return ['background-color: yellow'] * len(row)
    return [''] * len(row)

df.style.apply(color, axis=1)

enter image description here

Вы по-прежнемук этому нужно добавить собственные форматы чисел.

Чтобы получить HTML-код для этого, используйте метод render:

df.style.apply(color, axis=1).render()

<style  type="text/css" >
    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col0 {
            background-color:  red;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col1 {
            background-color:  red;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col2 {
            background-color:  red;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col3 {
            background-color:  red;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col0 {
            background-color:  yellow;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col1 {
            background-color:  yellow;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col2 {
            background-color:  yellow;
        }    #T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col3 {
            background-color:  yellow;
        }</style>  
<table id="T_e61b55e0_cef5_11e8_9f07_68f72880acdc" > 
<thead>    <tr> 
        <th class="blank level0" ></th> 
        <th class="col_heading level0 col0" >Limit</th> 
        <th class="col_heading level0 col1" >Status</th> 
        <th class="col_heading level0 col2" >Warning</th> 
        <th class="col_heading level0 col3" >3M AVG</th> 
    </tr></thead> 
<tbody>    <tr> 
        <th id="T_e61b55e0_cef5_11e8_9f07_68f72880acdclevel0_row0" class="row_heading level0 row0" >VAR1</th> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col0" class="data row0 col0" >1.2</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col1" class="data row0 col1" >1.21216</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col2" class="data row0 col2" >1.11</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow0_col3" class="data row0 col3" >1.21235</td> 
    </tr>    <tr> 
        <th id="T_e61b55e0_cef5_11e8_9f07_68f72880acdclevel0_row1" class="row_heading level0 row1" >VAR2</th> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow1_col0" class="data row1 col0" >0.82</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow1_col1" class="data row1 col1" >0.63075</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow1_col2" class="data row1 col2" >0.75</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow1_col3" class="data row1 col3" >0.593295</td> 
    </tr>    <tr> 
        <th id="T_e61b55e0_cef5_11e8_9f07_68f72880acdclevel0_row2" class="row_heading level0 row2" >VAR3</th> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col0" class="data row2 col0" >0.38</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col1" class="data row2 col1" >0.376988</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col2" class="data row2 col2" >0.35</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow2_col3" class="data row2 col3" >0.376988</td> 
    </tr>    <tr> 
        <th id="T_e61b55e0_cef5_11e8_9f07_68f72880acdclevel0_row3" class="row_heading level0 row3" >VAR4</th> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow3_col0" class="data row3 col0" >0.17</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow3_col1" class="data row3 col1" >0.126987</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow3_col2" class="data row3 col2" >0.14</td> 
        <td id="T_e61b55e0_cef5_11e8_9f07_68f72880acdcrow3_col3" class="data row3 col3" >0.12461</td> 
    </tr></tbody> 
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...