Правильная раскраска рядов с помощью стилера Pandas Dataframe - PullRequest
0 голосов
/ 11 мая 2018

Я трачу свое время на решение проблемы со строкой таблицы раскраски, если цвет основан на предыдущей строке.

В четырехточечной системе существует следующая логика. Если 0 или 1 пункт, цвет строки должен быть красным, если 3 или 4 пункта, цвет строки должен быть зеленым, а если 2 пункта, цвет должен быть таким же, как предыдущая строка.

Мне не удалось определить цвет предыдущей строки в кадре данных. Я решил это с помощью столбца «temp». К сожалению, этот столбец отображается в таблице HTML.

def should_colored(sum_of_points):
    if sum_of_points > 2:
        return True
    elif sum_of_points < 2:
        return False
    else:
        return np.NaN

def determine_coloring_for_row(results):
    tmp = pd.DataFrame(results.values, columns=['color_result'])

    tmp['color_result'] = tmp['color_result'].apply(lambda i : should_colored(i))    
    tmp['color_result'].fillna(method='ffill', inplace=True)

    return tmp['color_result'].values

def color_row(row, number_of_columns):
    color = 'green' if row['color_result'] else 'red' 

    return ['background-color: %s' % color] * number_of_columns

df['color_result'] = determine_coloring_for_row(df['sum_of_points'])
df.style.apply(color_row, number_of_columns = len(df.columns), axis=1)

enter image description here

Кто-нибудь знает, как решить эту проблему, используя style.apply или скрыв столбец метаданных?

1 Ответ

0 голосов
/ 11 мая 2018

Я думаю, что новый столбец не нужен, нужно DataFrame of styles только по оригинальным DataFrame столбцам и индексировать и устанавливать строки по условию с помощью mask:

def highlight(x):
    c1 = 'background-color: green'
    c2 = 'background-color: red' 

    df1 = pd.DataFrame(c2, index=x.index, columns=x.columns)
    df1 = df1.mask(df['sum_of_points'].map(should_colored).ffill(), c1)
    #print (df1)
    return df1

df.style.apply(highlight, axis=None)

Образец :

df = pd.DataFrame({'sum_of_points':[0,1,2,1,2,3,4,1,2,2,4,5,0,1,2],
                   'A':range(15)})

print (df)
     A  sum_of_points
0    0              0
1    1              1
2    2              2
3    3              1
4    4              2
5    5              3
6    6              4
7    7              1
8    8              2
9    9              2
10  10              4
11  11              5
12  12              0
13  13              1
14  14              2

def should_colored(sum_of_points):
    if sum_of_points > 2:
        return True
    elif sum_of_points < 2:
        return False
    else:
        return np.NaN

def highlight(x):
    c1 = 'background-color: green'
    c2 = 'background-color: red' 

    df1 = pd.DataFrame(c2, index=x.index, columns=x.columns)
    df1 = df1.mask(x['sum_of_points'].map(should_colored).ffill(), c1)
    return df1

df.style.apply(highlight, axis=None)

pic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...