在 Pandas 数据框上按列应用 seaborn 热图

Pys*_*che 5 python heatmap dataframe seaborn

我试图在像超链接那样工作的超链接中使用一个热图形式 seaborn

df = pd.DataFrame(np.random.randint(1,100,size = (3,2)))
df.columns = ['A','B']
df
sns.heatmap(df, annot=True, fmt="d", linewidths=.5,cmap="RdYlGn")
Run Code Online (Sandbox Code Playgroud)

代码块的输出 - 整个数据帧格式化为单个热图 输出选择 45 作为最小值,86 作为最大值,并对整个数据帧进行颜色编码

但是我无法做的是明智地应用热图列,即像按列而不是整个数据框应用列的条件格式一样。就像这个超链接中的例子一样 -

需要/预期的输出

对于 col1,选择并格式化了 45 的最小值和 88 的最大值,对于 col2,分别选择了 70 和 86 条件格式的列,但仍显示为表格。. 在示例中,我看到 df 的其余部分被设置为零并且只有 1 列被格式化,或者整个数据框都被格式化

任何人都可以帮忙吗

elz*_*elz 5

您还可以将每列缩放为最小值 0 和最大值 1,将其传递到热图,并使用原始值进行注释。

scaled_df = (df - df.min(axis=0))/(df.max(axis=0) - df.min(axis=0))
sns.heatmap(scaled_df, annot=df, fmt="d", linewidths=.5, cmap="RdYlGn")
Run Code Online (Sandbox Code Playgroud)

请注意,您可能希望删除颜色条,cbar=False因为解决方案必然需要每列使用不同的比例。

或者,sklearn.preprocessing.minmax_scale可以使用它来代替手动缩放。

from sklearn.preprocessing import minmax_scale

scaled_df = minmax_scale(df)
sns.heatmap(scaled_df, annot=df, fmt="d", linewidths=.5, cmap="RdYlGn")
Run Code Online (Sandbox Code Playgroud)


Pys*_*che 4

感谢@Implus3H 这个例子帮助了这里是代码的修改版本作为一个函数,它可以执行列明智的条件格式,以防万一它对其他人有用

df 是一个输入数据框,在下面的示例函数中,默认情况下其列将获得红色编码阴影

def columnwise_conditionalformat(df, color = 'Reds'):
    nrows = len(df)
    ncols = len(df.columns)
    fig, ax = plt.subplots()
    for i in range(ncols):
        truthar = [True]*ncols
        truthar[i] = False
        mask = truthar = np.array(nrows * [truthar], dtype=bool)
        red = np.ma.masked_where(mask, df)
        ax.pcolormesh(red, cmap=color)

    for y in range(df.shape[0]):
        for x in range(df.shape[1]):
            plt.text(x+.5,y+.5,'%.1f'% df.ix[y, x],
                    horizontalalignment='center',
                     verticalalignment='center'
                    )
    plt.show()
Run Code Online (Sandbox Code Playgroud)