Примените функцию к одной строке, чтобы выделить ячейки на основе условия

#python #pandas

Вопрос:

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

Мой df структурирован аналогично этому. Есть 43 колла и 4 строки, где первое имя колла-строки, а остальные-числа

  |Name | A  |  B | C  |
---------------------
0|ID1  | 1  | 2  | 3  |
1|ID1  | 4  | 5  | 6  |
2|ID1  | 7  | 8  | 9  |
3|Diff | 25 | 19 | 40 | 
 

Для чисел в разнице строк я хочу выделить только те, которые больше 20. Таким образом, результат будет

  |Name | A  |  B | C  |
---------------------
0|ID1  | 1  | 2  | 3  |
1|ID1  | 4  | 5  | 6  |
2|ID1  | 7  | 8  | 9  |
3|Diff | **25** | 19 | **40** | 
 

Я пытался

 df.iloc[-1,:].style.apply((lambda x: 'background-color : red' if x>20 else ''), axis=1)
 

Но я получаю, что серия не имеет стиля атрибута.

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

Это работает, но он окрашивает все ячейки больше 20 и не печатает столбец Имени, который мне нужен

 def color_PercentDiff(df):
    s = pd.DataFrame('', index=dummy.index, columns=dummy.columns)
    s[df>20] = 'background-color : red'
    return s

df.iloc[:,1:].style.apply(color_PercentDiff, axis=None)
 

Ответ №1:

Воспользуйся pd.IndexSlice

 def color_PercentDiff(df):
    s = pd.DataFrame('', index=df.index, columns=df.columns)
    s[df>20] = 'background-color : red'
    return s

subs =pd.IndexSlice[[df.last_valid_index()], df.columns[1:]]
res = df.style.apply(color_PercentDiff, axis=None, subset=subs)
 

или

 subs =pd.IndexSlice[[df.last_valid_index()], df.columns[1:]]
res = df.style.apply(lambda x: np.where(x>20, 'background-color : red', ''), axis=1, subset=subs)
 

RES:

введите описание изображения здесь