#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)
Оба Производят: