Условное форматирование Панд: выделение ячеек в одном кадре, которые не соответствуют ячейкам в другом

#python #pandas #pandas-styles #python-applymap

Вопрос:

Учитывая два фрейма данных pandas df1 и df2, которые имеют одинаковую схему (т. Е. Одинаковый индекс и столбцы и, следовательно, одинаковый размер), я хочу раскрасить только те ячейки в df1, которые не соответствуют их аналогу в df2. Есть какие-нибудь намеки?

В более общем плане, если у меня есть предопределенная матрица цветов, colormat, которая имеет те же размеры, что и df1, могу ли я каким-то образом раскрасить каждую ячейку df1 на основе цвета, заданного в colormat?

Простой пример

 df1 = pd.DataFrame({'colA':[3,4,5], 'colB':[6,7,8]})
df2 = pd.DataFrame({'colA':[3,4,50], 'colB':[6,70,8]})

colormat = df1.eq(df2).replace({False:'red', True:'green'})
 

Применительно к df1 я хочу, чтобы df1.loc[2,’colA’] и df1.loc[1, ‘ColB’] были окрашены в красный цвет, а остальные ячейки-в зеленый, так как 5 != 50 и 7 != 70

Комментарии:

1. Если бы вы дали образцы df1 df2 и эту матрицу цветов , на этот вопрос было бы легче ответить.

2. Хорошая идея, добавлен пример

Ответ №1:

Стили должны быть допустимыми CSS, поэтому измените «красный» и «зеленый» на 'background-color: red' «и 'background-color: green' «, а затем просто apply включите axis=None и передайте фрейм данных colormat :

 import pandas as pd

df1 = pd.DataFrame({'colA': [3, 4, 5], 'colB': [6, 7, 8]})
df2 = pd.DataFrame({'colA': [3, 4, 50], 'colB': [6, 70, 8]})

colormat = df1.eq(df2).replace({False: 'background-color: red',
                                True: 'background-color: green'})
df1.style.apply(lambda _: colormat, axis=None)
 

В зависимости от размера np.where фреймы данных могут быть более производительными:

 colormat = np.where(df1.eq(df2),
                    'background-color: green',
                    'background-color: red')

df1.style.apply(lambda _: colormat, axis=None)
 

Оба Производят:

стилизованный стол