首页 > 解决方案 > 设置熊猫数据框的上三角、下三角和对角线样式

问题描述

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

返回

    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,带有0和的矩阵)。1

我该如何做最后一步?

提前非常感谢。

标签: pandasdataframepandas-styles

解决方案


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)

输出:

在此处输入图像描述


推荐阅读