我已经生成了一个熊猫数据框,我想使用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
的矩阵,根据每个部分的颜色(上部,下部三角形和对角线)进行了样式化。>
我该如何做最后一步?
非常感谢。
答案 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)
输出:
答案 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)