Pandas 条件格式:突出显示一帧中与另一帧中不相等的单元格

Pandas conditional formatting: Highlighting cells in one frame that are unequal to those in another

给定两个 pandas 数据帧 df1 和 df2,它们具有完全相同的架构(即相同的索引和列,因此大小相等),我只想为 df1 中与它们在df2。有什么提示吗?

更一般地说,如果我有一个预定义的颜色矩阵 colormat,其尺寸与 df1 相同,我能否根据 colormat 中给定的颜色以某种方式为 df1 的每个单元格着色?

简单示例

df1 = pd.DataFrame({'colA':[3,4,5], 'colB':[6,7,8]})
df2 = pd.DataFrame({'colA':[3,4,50], 'colB':[6,70,8]})

colormat = df1.eq(df2).replace({False:'red', True:'green'})

应用于 df1 时,我希望 df1.loc[2,'colA'] 和 df1.loc[1, 'colB'] 为红色,其他单元格绿色,因为 5 != 50 和 7 != 70

样式需要有效 CSS,所以将 'red' 和 'green' 更改为 'background-color: red''background-color: green',然后只需 applyaxis=None 上传递 colormat DataFrame:

import pandas as pd

df1 = pd.DataFrame({'colA': [3, 4, 5], 'colB': [6, 7, 8]})
df2 = pd.DataFrame({'colA': [3, 4, 50], 'colB': [6, 70, 8]})

colormat = df1.eq(df2).replace({False: 'background-color: red',
                                True: 'background-color: green'})
df1.style.apply(lambda _: colormat, axis=None)

取决于 DataFrame 的大小 np.where 可能性能更高:

colormat = np.where(df1.eq(df2),
                    'background-color: green',
                    'background-color: red')

df1.style.apply(lambda _: colormat, axis=None)

两者都产生: