【问题标题】:Triangular heatmap from 3-column dataframe来自 3 列数据框的三角形热图
【发布时间】:2019-01-29 20:10:05
【问题描述】:

我有一个包含两个分类列和第三个整数的数据框:

import pandas as pd

df1 = pd.DataFrame({
    'First': ['A','A','A','B','B','C'], 
    'Second': ['B','C','D','C','D','D'], 
    'Value': [1,2,3,4,5,6]}
)

df1

    First   Second  Value
0   A   B   1
1   A   C   2
2   A   D   3
3   B   D   4
4   B   D   5
5   C   D   6

我想得到对应的三角矩阵,as(缺失值可以是NAs):

A B C D
  1 2 3 A
    4 5 B
      6 C

最后,将它绘制在一个三角形热图中,我相信我可以在 this question 的帮助下做到这一点,但是,这需要一个 numpy 掩码数组作为输入。也非常欢迎其他不使用 numpy 来绘制此图的解决方案。

关于如何实现这一点的任何 Pythonic 想法?

编辑:

我意识到我给出的例子太简洁了。我的专栏没有按照上面的方式组织。所以我有这样的事情:

df1 = pd.DataFrame({
'First': ['D','C','B','A','C','A','B','D','B','C'], 
'Second': ['E','E','C','D','D','E','E','B','A','A'], 
'Value': [1,2,3,4,5,6,7,8,9,10]}

)

      First Second  Value
0     D      E      1
1     C      E      2
2     B      C      3
3     A      D      4
4     C      D      5
5     A      E      6
6     B      E      7
7     D      B      8
8     B      A      9
9     C      A     10

df1.pivot('First','Second','Value')

生产

  Second    A    B      C      D      E
First                   
A          NaN  NaN     NaN     4.0     6.0
B          9.0  NaN     3.0     NaN     7.0
C         10.0  NaN     NaN     5.0     2.0
D          NaN  8.0     NaN     NaN     1.0

一个非三角形、非对称矩阵。我需要具有相同数量的行和列,并将所有这些 NaN 推到边缘以创建一个三角形。 Pivot 似乎不是一个可能的解决方案

EDIT2

解决方案和期望的输出存在并且是:

    A   B   C   D   E
A   NaN 9   10  4   6
B   NaN NaN 3   8   7
C   NaN NaN NaN 5   2
D   NaN NaN NaN NaN 1
E   NaN NaN NaN NaN NaN

【问题讨论】:

    标签: python pandas matplotlib heatmap triangular


    【解决方案1】:

    您可以pivot 然后将DataFrame 传递给您的链接解决方案:

    df = df1.pivot('First','Second','Value')
    print (df)
    Second    B    C    D
    First                
    A       1.0  2.0  3.0
    B       NaN  4.0  5.0
    C       NaN  NaN  6.0
    
    from matplotlib import pyplot as PLT
    from matplotlib import cm as CM
    
    
    fig = PLT.figure()
    ax1 = fig.add_subplot(111)
    cmap = CM.get_cmap('jet', 10) # jet doesn't have white color
    cmap.set_bad('w') # default value is 'k'
    #passed DataFrame
    ax1.imshow(df, interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    PLT.show()
    

    编辑:解决方案是对每行的列 FirstSecond 进行排序:

    df1[['First','Second']] = np.sort(df1[['First','Second']], axis=1)
    df = df1.pivot('First','Second','Value')
    print (df)
    Second    B     C    D    E
    First                      
    A       9.0  10.0  4.0  6.0
    B       NaN   3.0  8.0  7.0
    C       NaN   NaN  5.0  2.0
    D       NaN   NaN  NaN  1.0
    
    from matplotlib import pyplot as PLT
    from matplotlib import cm as CM
    
    #
    fig = PLT.figure()
    ax1 = fig.add_subplot(111)
    cmap = CM.get_cmap('jet', 10) # jet doesn't have white color
    cmap.set_bad('w') # default value is 'k'
    #passed DataFrame
    ax1.imshow(df, interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    PLT.show()
    

    【讨论】:

    • 谢谢。但是我仍然有一个问题,即没有大数据框/真实数据的三角形。 NaN 分布在整个枢轴上。我尝试使用 df2 = df.reindex(df.sum().sort_values(ascending=False).index, axis=1) 进行排序并重复列,但 NaN 不会被推到边缘。我不能将 fillna 与枢轴一起使用,因为排序不会产生三角形
    • @JRCX - 嗯,我认为问题是如果缺少像df1 = pd.DataFrame({ 'First': ['A','A','B','B','C'], 'Second': ['B','C','C','D','D'], 'Value': [1,2,4,5,6]} )pandas 这样的值,总是会创建二维矩阵并添加 NaN。我认为对于真实数据来说这是正常的。
    • 是的,我希望 NaN 存在。他们将允许正方形的一半是空白的。但在我的示例中(现在我意识到这是一个糟糕的示例),数据是整齐有序的。在一个真实的例子中,pivot 将 NaN 分散在一个未排序的非三角形结果中。
    • @JRCX - 为您添加了解决方案,检查已编辑的答案。
    • justify 弄乱了数据。创建的图像确实是一个三角形,但数组的行和列不再对应于枢轴数据帧的原始列和行。也无法再访问这些以将它们输入到绘图轴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多