基于布尔值高亮元素 pandas df

Highlight element based on boolean pandas df

我有 2 个相同的数据框 indices/columns:

df = pd.DataFrame({'A':[5.5, 3, 0, 3, 1],
                     'B':[2, 1, 0.2, 4, 5],
                     'C':[3, 1, 3.5, 6, 0]})

df_bool = pd.DataFrame({'A':[0, 1, 0, 0, 1],
                          'B':[0, 0, 1, 0, 0],
                          'C':[1, 1, 1, 0, 0]})

我想使用 df_bool 作为掩码对 df 元素应用样式函数。

这是预期的结果:

当前失败的函数

def color_boolean(val):
  color =''
  if df_bool == 1:
    color = 'red'
  elif df_bool == 0:
    color = 'black'
  return f'color: {color}'

df.head().style.apply(color_boolean, axis=None)
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

您可以使用忽略输入并仅使用另一个 DataFrame 的函数:

def color_boolean(val):
    return f'color: {"red" if val else "black"}'

df.style.apply(lambda _: df_bool.applymap(color_boolean), axis=None)

或:

df.style.apply(lambda c: df_bool[c.name].apply(color_boolean))

输出:

您还可以使用 np.where 根据 1 值 (df_bool.eq(1)) 的位置将 df_bool 转换为样式的 DataFrame。

通过将 axis=None 设置为 Styler.apply 我们可以有效地将样式应用于整个 DataFrame。

true_css = 'color:red'
false_css = '' # No Styles (Change if needed)

df.style.apply(
    lambda _: np.where(df_bool.eq(1), true_css, false_css),
    axis=None
)


可选 format 舍入并匹配显示的输出:

true_css = 'color:red'
false_css = ''

df.style.apply(
    lambda _: np.where(df_bool.eq(1), true_css, false_css),
    axis=None
).format(formatter='{:1g}')


导入(和版本):

import numpy as np  # 1.22.3
import pandas as pd  # 1.4.2