python - 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 |
我的代码在这里:
'''
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
其中包含 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()
推荐阅读
- r - 为什么以下 for 循环在 R 中使用我机器中的所有内核?
- python - 在python中模拟扩展类
- java - Thymeleaf 无法读取静态文件夹中的文件
- python - 在 cpp 中运行 python 代码或使用 cpp 发送电子邮件
- java - 这个错误是什么意思?“maven 构建失败:src\assembly\zip.xml 不存在
- animation - 如何使用 Apache Royale 对状态变化产生过渡效果?
- python - 为什么这段代码不能从我的 Keras LSTM 中获得重现性?
- c++ - 创建不同模板化对象的模板化数组的模板化数组
- arrays - 如何将一列逗号分隔的字符串转换为字符串数组
- javascript - 尝试在 Vue 中将 props 传递给孩子:“Expected String with value ”[object Object]“, got Object”