EXCEL PYTHON中的颜色特定单元格

问题描述

我有两个数据帧,我必须从中识别单元格中的差异。无论我在哪里发现差异,我都必须在第一个数据帧和第二个数据帧中更改该单元格的颜色(背景色)。 在我的例子中,第一个DataFrame单元格必须用#FFCCCC着色,第二个用#DAF6FF着色。这些数据帧的输出必须保存在两个不同的EXCEL文件中。

我尝试了以下答案:https://kanoki.org/2019/01/02/pandas-trick-for-the-day-color-code-columns-rows-cells-of-dataframe/

Python pandas dataframe and excel: Add cell background color

所有这些内容都是关于使用带Style的Openpyxml的。我的挑战是我必须更新那些在比较阶段本身发生变化并且(着色)必须反映在Excel输出中的单元格。 我如何实现这一点?希望有人能帮我找到正确的更好的方法。

注意:我的数据很大(行列中大约有10000行)。

输入:

df1:

第1列 第2列 第3列
10 BNG
12 PE CHN
30 点赞 DHL

DF2:

第1列 第2列 第3列
10 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)

‘’


解决方案

可以通过生成比较矩阵简化比较代码:

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()

相关文章