Pandas 设置数据帧的上三角形、下三角形和对角线的样式

Pandas 设置数据帧的上三角形、下三角形和对角线的样式,pandas,dataframe,pandas-styles,Pandas,Dataframe,Pandas Styles,我已经生成了一个pandas数据框,我想使用pd.dataframe().style突出显示一些单元格 v1 v2 v3 v4 v5 v1 0 1 1 1 0 v2 0 0 1 1 1 v3 0 0 0 0 0 v4 0 0 0 0 0 v5 0 0 0 0 0 我想给它的上三角和下三角以及对角线上色。为此,我做了以下工作: 计算下三角形、上三角形和对角线 def triang(df):

我已经生成了一个pandas数据框,我想使用
pd.dataframe().style
突出显示一些单元格

    v1  v2  v3  v4  v5
v1  0   1   1   1   0
v2  0   0   1   1   1
v3  0   0   0   0   0
v4  0   0   0   0   0
v5  0   0   0   0   0
我想给它的上三角和下三角以及对角线上色。为此,我做了以下工作:

  • 计算下三角形、上三角形和对角线

    def triang(df):
        temp=df.copy()
        ut=np.triu(np.ones(df.shape),1).astype(np.bool)
        lt=np.tril(np.ones(df.shape),-1).astype(np.bool)
    
        temp=temp.where(ut==False, 'up')
        temp=temp.where(lt==False, 'lt')
        np.fill_diagonal(temp.values,'dg')
        return(temp)
    
    triang(mymat)
    
  • 返回

        v1  v2  v3  v4  v5
    v1  dg  up  up  up  up
    v2  lt  dg  up  up  up
    v3  lt  lt  dg  up  up
    v4  lt  lt  lt  dg  up
    v5  lt  lt  lt  lt  dg
    
  • 定义颜色函数

    def color_vals(value):
         if value == 'up':
             color='orange'
         elif value=='lt':
             color='blue'
         else:
             color='black'
         return(color)
    color_vals('up')
    #'orange'
    
  • 设置数据帧的样式

    triang(mymat).style.applymap(color_vals)
    #returns the same as triang(mymat)
    
  • 我陷入了风格部分(第3步)。我希望看到第一个矩阵(
    mymat
    ,即带有
    0
    1
    的矩阵)根据每个部分的颜色(上部、下部三角形和对角线)进行样式化

    我该怎么做最后一步

    提前非常感谢。

    IIUC,试试这个:

    其中df_vals:

        v1  v2  v3  v4  v5
    v1   0   1   1   1   0
    v2   0   0   1   1   1
    v3   0   0   0   0   0
    v4   0   0   0   0   0
    v5   0   0   0   0   0
    
    def triang(df):
        temp=df.copy()
        ut=np.triu(np.ones(df.shape),1).astype(np.bool)
        lt=np.tril(np.ones(df.shape),-1).astype(np.bool)
    
        temp=temp.where(ut==False, 'up')
        temp=temp.where(lt==False, 'lt')
        np.fill_diagonal(temp.values,'dg')
        return(temp)
    
    def color_vals(val):
        """
        Color dataframe using values
        """
        d = {'up' : 'orange',
             'dg' : 'black',
             'lt' : 'blue'}
        return [f'color : {i}' for i in triang(df_vals).loc[val.name, val.index].map(d).tolist()] 
    
    df_vals.style.apply(color_vals)
    
    输出:

    IIUC,试试这个:

    其中df_vals:

        v1  v2  v3  v4  v5
    v1   0   1   1   1   0
    v2   0   0   1   1   1
    v3   0   0   0   0   0
    v4   0   0   0   0   0
    v5   0   0   0   0   0
    
    def triang(df):
        temp=df.copy()
        ut=np.triu(np.ones(df.shape),1).astype(np.bool)
        lt=np.tril(np.ones(df.shape),-1).astype(np.bool)
    
        temp=temp.where(ut==False, 'up')
        temp=temp.where(lt==False, 'lt')
        np.fill_diagonal(temp.values,'dg')
        return(temp)
    
    def color_vals(val):
        """
        Color dataframe using values
        """
        d = {'up' : 'orange',
             'dg' : 'black',
             'lt' : 'blue'}
        return [f'color : {i}' for i in triang(df_vals).loc[val.name, val.index].map(d).tolist()] 
    
    df_vals.style.apply(color_vals)
    
    输出:

    我希望看到第一个矩阵(mymat,带有0和1的矩阵)根据每个部分的颜色(上部、下部三角形和对角线)进行样式化

    好的,您可以修改如下函数:

    def myfunc(x):
        c1=np.triu(np.ones(df.shape),1).astype(np.bool)
        c2=np.tril(np.ones(df.shape),-1).astype(np.bool)
        col1='color:orange'
        col2='color:blue'
        col3='color:black'
        df1 = pd.DataFrame(np.select([c1,c2],[col1,col2],col3),columns=x.columns,index=x.index)
        return df1
    


    我希望看到第一个矩阵(mymat,带有0和1的矩阵)根据每个部分的颜色(上部、下部三角形和对角线)进行样式化

    好的,您可以修改如下函数:

    def myfunc(x):
        c1=np.triu(np.ones(df.shape),1).astype(np.bool)
        c2=np.tril(np.ones(df.shape),-1).astype(np.bool)
        col1='color:orange'
        col2='color:blue'
        col3='color:black'
        df1 = pd.DataFrame(np.select([c1,c2],[col1,col2],col3),columns=x.columns,index=x.index)
        return df1
    



    嗨,斯科特,非常感谢你。但是,我希望看到包含这些颜色的
    0
    1
    的初始矩阵。如果我解释得不好,我会编辑我的帖子。。。可以我想我明白了。@Sosi我花了一点时间才重新开始工作。没问题,斯科特,谢谢你,我真的很感激!嗨,斯科特,非常感谢你。但是,我希望看到包含这些颜色的
    0
    1
    的初始矩阵。如果我解释得不好,我会编辑我的帖子。。。可以我想我明白了。@Sosi我花了一点时间才重新开始工作。没问题,斯科特,谢谢你,我真的很感激!