使用另一个数据框的数据框的条件样式

Conditional styling of a DataFrame using another dataframe

我有两个 3X3 pandas DataFrames df1

    A   B   C
0   8   3   9
1   1   7   7
2   3   3   8

df2.

    A   B   C
0   2   1   2
1   5   9   7
2   1   8   3

我想获得的是一个表格化的Jupyter Notebook输出,其元素与df1相同,但如果元素值大于df2的对应值,则其字体颜色为红色。 因此,预期的输出类似于以下内容

    A     B     C
0   8(r)  3(r)  9(r)
1   1     7     7 
2   3(r)  3     8(r)

(r)表示单元格的字体颜色为红色,不是真正的打印输出。


我试过的是applymap这样的方法

df1.style.applymap(lambda x: 'color : red' if x > df2 else '')

但无法弄清楚如何将 labmda xdf2 置于平等地位。 有人能帮忙吗?

我们应该在 axis=None:

上创建一个样式的 DataFrame 然后 Styler.apply
import pandas as pd

df1 = pd.DataFrame({'A': [8, 1, 3], 'B': [3, 7, 3], 'C': [9, 7, 8]})
df2 = pd.DataFrame({'A': [2, 5, 1], 'B': [1, 9, 8], 'C': [2, 7, 3]})

选项 1:比较 replace

style_df = (
        df1 > df2                  # Compare DataFrames
).replace({
    True: 'background-color:red',  # True Styles
    False: ''                      # False Styles
})

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

或者直接在应用调用中创建样式 DataFrame:

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

选项 2:可能性能更高,但不太惯用 np.where:

import numpy as np

df1.style.apply(lambda _: np.where(
    df1 > df2,               # Compare DataFrames
    'background-color:red',  # True Styles
    ''                       # False Styles
), axis=None)

两者都产生样式 table:

如何使用 style_df 确定样式:

                      A                     B                     C
0  background-color:red  background-color:red  background-color:red
1                                                                  
2  background-color:red                        background-color:red