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()
相关文章