样式化 pandas 数据框的上三角、下三角和对角线

Styling upper triangular, lower triangular, and diagonal of a pandas dataframe

我生成了一个 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

我想给它的上三角和下三角以及对角线上色。为此,我正在执行以下操作:

  1. 计算下三角和上三角以及对角线。

    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)
    

returns

    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
  1. 定义颜色函数

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

    triang(mymat).style.applymap(color_vals)
    #returns the same as triang(mymat)
    

我卡在了样式部分(第 3 步)。我希望看到第一个矩阵(mymat,带有 01 的矩阵)根据每个部分的颜色(上三角、下三角和对角线)风格化。

最后一步怎么办?

非常感谢。

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)

输出:

I'd like to see the very first matrix (mymat, the one with 0 and 1) stylized according to the colors per section (upper, lower triangular and diagonal)

好的,您可以像下面这样修改函数:

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

df.style.apply(myfunc,axis=None) # mymat.style.apply(myfunc,axis=None)