DataFrame Styling based on conditions for groups of columns

后端 未结 1 492
执念已碎
执念已碎 2021-01-28 00:10

I need to style a Dataframe:

df = DataFrame({\'A\':[\'Bob\',\'Rob\',\'Dob\'],\'B\':[\'Bob\', \'Rob\',\'Dob\'],\'C\':[\'Bob\',\'Dob\',\'Dob\'],\'D\':[\'Ben\',\'Te         


        
相关标签:
1条回答
  • 2021-01-28 00:44

    I believe need:

    def highlight(x):
        c1 = 'background-color: red'
        c2 = '' 
        #define groups of columns for compare by first value of group ->
        #first with A, second with D
        cols = [['A','B','C'], ['D','E']]
    
        #join all masks together
        m = pd.concat([x[g].eq(x[g[0]], axis=0) for g in cols], axis=1)
        df1 = pd.DataFrame(c2, index=x.index, columns=x.columns)
        df1 = df1.where(m, c1)
        return df1
    
    df.style.apply(highlight, axis=None)
    

    EDIT: For multiple colors is possible create dictionary by colors with columns for compare:

    def highlight(x):
        c = 'background-color: '
        cols = {'red': ['A','B','C'], 'blue':['D','E']}
    
        m = pd.concat([x[v].eq(x[v[0]], axis=0).applymap({False:c+k, True:''}.get) 
                       for k, v in cols.items()], axis=1)
        return m
    

    EDIT1:

    Alternative solution:

    def highlight(x):
        c = 'background-color: '
        cols = {'red': ['A','B','C'], 'blue':['D','E']}
    
        df1 = pd.DataFrame(c, index=x.index, columns=x.columns)
    
        for k, v in cols.items():
            m = x[v].eq(x[v[0]], axis=0).reindex(columns=x.columns, fill_value=True)
            df1 = df1.where(m, c+k)
        return df1    
    
    df.style.apply(highlight, axis=None)
    
    0 讨论(0)
提交回复
热议问题