样式化 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
我想给它的上三角和下三角以及对角线上色。为此,我正在执行以下操作:
计算下三角和上三角以及对角线。
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
定义颜色函数
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)
输出:
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)
我生成了一个 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)
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
定义颜色函数
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)
输出:
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)