如何突出显示除 NaN 之外的所有重复行?

How to highlight all duplicate rows except NaN?

我有一个这样的数据框

Date ID_1 ID_2 Name
2021-2-3 12 23 Sam
2021-2-3 12 56 Sem
2021-2-3 33 56 Tom
2021-2-3 35 45 Jon
2021-2-3 35 23 Sam
2021-2-3 Nan 99 Jim
2021-2-3 35 Nan Jon
2021-2-3 88 44 Sam

我想用绿色突出显示所有具有相同 ID 的重复行

Date ID_1 ID_2 Name Hightlight
2021-2-3 12 23 Sam True
2021-2-3 12 56 Sem True
2021-2-3 33 56 Tom True
2021-2-3 35 45 Jon True
2021-2-3 35 23 Sam True
2021-2-3 Nan 99 Jim
2021-2-3 35 Nan Jon True
2021-2-3 88 44 Sam

您可以将 df.style 与自定义函数一起使用:

def duplicated(s):
    if s.name.startswith('ID'):
        return (s.duplicated()&s.notna()).map({True: 'background-color:green', False: None})
    else:
        return [None]*len(s)

df.style.apply(duplicated, axis=0)

或更好:

def duplicated(s):
    return (s.duplicated()&s.notna()).map({True: 'background-color:green', False: None})
df.style.apply(duplicated, subset=df.columns.str.startswith('ID'), axis=0)

编辑:为了好玩,这里有一种方法可以用不同的颜色突出显示初始副本:

def duplicated(s):
    return ((s.duplicated().astype(int)
            +s.duplicated(keep=False).astype(int)
            )*s.notna().astype(int)
            ).map({2: 'background-color:green;color:white',
                   1: 'background-color:lightgreen',
                   0: None})
df.style.apply(duplicated, subset=df.columns.str.startswith('ID'), axis=0)