#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: