цвет определенных ячеек в excel python

у меня есть 2 кадра данных, из которых я должен определить разницу в ячейках. Везде, где я найду разницу, я должен изменить цвет этой ячейки (цвет фона) в первом кадре данных, а также во втором кадре данных. В моем случае первая ячейка данных должна быть окрашена #FFCCCC, а вторая - #DAF6FF. Вывод этих фреймов данных должен быть сохранен в двух разных файлах Excel.

я пробовал с этими ответами: https://kanoki.org/2019/01/02/pandas-trick-for-the-day-color-code-columns-rows-cells-of-dataframe/

Python pandas dataframe и excel: добавьте цвет фона ячейки

Все эти разговоры об использовании openpyxml со стилем. Моя задача заключается в том, что я должен обновить те ячейки, в которых есть изменения на самой фазе сравнения, и это (окраска) должно быть отражено в выводе Excel. Как мне этого добиться? надеюсь, что кто-нибудь поможет мне найти правильный и лучший метод.

Примечание: мои данные огромны по размеру (около 10000 строк в столбцах строк).

Вход:

DF1:

col1 col2 col3
10 Yes BNG
12 PE CHN
30 LIKE DHL

DF2:

col1 col2 col3
10 No BNG
13 PE CHI
30 SNM DHL

Выходные данные должны быть в формате Excel с ячейками, окрашенными таким образом. введите здесь описание изображения

Мой код здесь:

'''

def split_compare_differ_df(difference_in_df):
    bg_delete = "background-color: red"
    bg_insert = "background-color: blue"
    unique_of_df1 = df1
    unique_of_df2 = df2
    for i in unique_of_df1.itertuples():
        for j in unique_of_df2.itertuples():
            if i[1] == j[1]:
                for idx, (a, b) in enumerate(zip(i, j)):
                    x=list(i)
                    y=list(j)
                    if not idx ==0:
                        if a == b:
                            x[idx] = a
                            y[idx] = b
                            print(f'Index {idx} match: {a}')
                        else:
                            x[idx] = '{}{}'.format(bg_delete,a)
                            y[idx] = '{}{}'.format(bg_insert, b)
                            print(f'Index {idx} no match: {a} vs {b}')
#                             targetFileActiveSheet.cell(row=rowNum, column=colNum).fill = PatternFill(bgColor='FFEE08', fill_type = 'solid')
                    i = tuple(x)
                    j = tuple(y)

                i_list = list(i)
                i_list = i_list[1:]
                i_tuple = tuple(i_list)
                j_list = list(j)
                j_list = j_list[1:]
                j_tuple = tuple(j_list)
                unique_of_df1.loc[i[0]] = i_tuple
                unique_of_df2.loc[j[0]] = j_tuple
    return(unique_of_df1,unique_of_df2)

'''


person ras    schedule 18.05.2021    source источник
comment
Пожалуйста, включите свой код.   -  person Charlie Clark    schedule 18.05.2021
comment
@CharlieClark я обновил свой код ..   -  person ras    schedule 18.05.2021


Ответы (1)


Код сравнения можно упростить, сгенерировав матрицу различий:

from styleframe import StyleFrame, Styler

sf1 = StyleFrame({'col1': [10, 12, 30], 'col2': ['Yes', 'PE', 'LIKE'], 'col3': ['BNG', 'CHN', 'DHL']})
sf2 = StyleFrame({'col1': [10, 12, 30], 'col2': ['No', 'PE', 'SNM'], 'col3': ['BNG', 'CHI', 'DHL']})

sf1_diff = Styler(bg_color='#FFCCCC')
sf2_diff = Styler(bg_color='#DAF6FF')

ne = sf1.data_df != sf2.data_df

print(ne)

Теперь ne представляет собой матрицу различий, содержащую True, где есть разница между двумя кадрами данных:

    col1   col2   col3
0  False   True  False
1  False  False   True
2  False   True  False

Теперь все, что нам нужно сделать, это соответствующим образом стилизовать исходные кадры:

for col in ne.columns:
    sf1.apply_style_by_indexes(indexes_to_style=ne[ne[col]].index,
                               styler_obj=sf1_diff,
                               cols_to_style=col)
    sf2.apply_style_by_indexes(indexes_to_style=ne[ne[col]].index,
                               styler_obj=sf2_diff,
                               cols_to_style=col)

sf1.to_excel('sf1.xlsx').save()
sf2.to_excel('sf2.xlsx').save()

И мы получаем sf1.xlsx:

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

и sf2.xlsx:

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

Если вы хотите, чтобы обе рамки находились на одном листе, вы можете использовать

writer = StyleFrame.ExcelWriter('output.xlsx')
sf1.to_excel(writer)
sf2.to_excel(writer, startcol=len(sf1.columns) + 2)
writer.save()
person DeepSpace    schedule 18.05.2021
comment
я попробовал первую фазу вашего решения, которая предлагает сравнить выходные данные в объекте «ne». Однако у меня это не работает, поскольку в нем говорится, что можно сравнивать только объекты DataFrame с одинаковой маркировкой, здесь я не могу удалить свой столбец индекса, поскольку это требуется для дальнейшей обработки ... @DeepSpace - person ras; 19.05.2021