首页 > 解决方案 > 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 数据框和 excel:添加单元格背景颜色

所有这些都是关于使用带有样式的 openpyxml。我的挑战是我必须更新那些在比较阶段本身发生变化的单元格,并且(着色)必须反映在 excel 输出中。我如何做到这一点?希望有人能帮助我在这里获得正确和更好的方法。

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

输入:

DF1:

col1 col2 col3
10 是的 BNG
12 体育 中国
30 喜欢 DHL

DF2:

col1 col2 col3
10 BNG
13 体育
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)

'''

标签: pythonopenpyxlxlrdpandas.excelwriterstyleframe

解决方案


可以通过生成“差异矩阵”来简化比较代码:

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其中包含 2 个数据帧之间的差异:

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

推荐阅读