如何根据只出现 x 次的列值突出显示行?

How to highlight rows based on a column value that only appears x amount of times?

使用示例数据框 df,如下所示:

Name Day
Bob Monday
John Thursday
Sam Friday
Bob Monday
Katie Sunday
Kyle Tuesday
Katie Saturday
Bob Wednesday
Katie Sunday
Sam Thursday
Joe Friday

我想做的是突出显示一行,如果名称列中的值只出现一次,则说黄色,如果该值出现两次,则说红色。

我尝试做的是按名称对它们进行分组,然后执行类似以下操作以突出显示名称出现一次的行:

highlight = lambda x: ['background: yellow' if (x['Name'] != (x-1)['Name'] and x['Name'] != (x+1)['Name']) else '' for i in x]

df.style.apply(highlight, axis = 1)

但是,这没有用,所以我没有着手尝试突出显示名称列中出现两次的值的行。尽管尝试对其进行研究,但我并不完全了解 lambda x 的工作原理,因此我不知道您是否可以应用运算符来访问前一行。

编辑:

根据推荐的问题,我尝试了以下方法:

def color_recommend():
    for index, row in enumerate(df):
        if df.Name.str.count(df.loc[i, 'Name']).sum() == 1:
            color = 'red'
        elif df.Name.str.count(df.loc[i, 'Name']).sum() == 2:
            color = 'green'
        else:
            color = 'white'
        return 'background-color: %s' % color
    
df.style.applymap(color_recommend)

但它仍然不适合我。我不确定我在这里遗漏了什么。

首先创建一个包含counts->color映射的字典,然后使用value_counts计算每个字符串在Name列中出现的频率,然后map使用 cmap 字典计算频率以创建 colors,最后在每一列上应用 colors 以获得结果

cmap = {1: 'green', 2: 'yellow', 3: 'red'}
freq = df['Name'].map(df['Name'].value_counts())
colors = freq.map(cmap).radd('background-color: ')

df.style.apply(lambda s: colors)

结果