设置熊猫数据框的上三角,下三角和对角线

时间:2019-08-21 15:47:33

标签: pandas dataframe pandas-styles

我已经生成了一个熊猫数据框,我想使用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,一个具有01的矩阵,根据每个部分的颜色(上部,下部三角形和对角线)进行了样式化。

我该如何做最后一步?

非常感谢。

2 个答案:

答案 0 :(得分:3)

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)

输出:

enter image description here

答案 1 :(得分:2)

  

我想看看第一个矩阵(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

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

enter image description here