【问题标题】:Creating a HeatMap from a Pandas MultiIndex Series从 Pandas 多索引系列创建热图
【发布时间】:2019-01-31 23:55:38
【问题描述】:

我有一个 Pandas DF,我需要创建一个热图。我的数据看起来像这样,我想将年份放在列中,将天放在行中,然后将其与 Seaborn 一起使用来创建热图

我尝试了多种方法,但是当我选择 DF 时,我总是得到“形状不一致”,那么有什么关于如何转换它的建议吗?

年和日是这个系列的索引

2016 年

  Tuesday  4
  Wednesady 6
  .....

2017

  Tuesday  4.4
  Monday   3.5
 ....

将 seaborn 导入为 sns ax = sns.heatmap(dayofweek)

【问题讨论】:

  • 如果您可以创建一个最小的代码示例来重现您的错误,这将有所帮助。这将使帮助他人弄清楚发生了什么并提供帮助变得容易得多。
  • 谢谢,这是真的。我想知道我的代码是如何基于另一个数据库的提取的,并且在其中一个转换中我最终得到了那个汇总表。但基本问题是:如果我有一个多索引系列,例如 Level0=Years 和 level1=Months,我希望将 Years 列在列中,然后创建一个热图,如矩阵中的 Months in Rows 和 Years in Columns以及里面的数据..如何将数据从一种格式移动到另一种格式?
  • 根据我的经验,花时间创建一个最小的示例通常可以帮助您解决自己的问题。 “玩具示例”使您可以更轻松地进行实验和提炼问题,并为其他人阐明您到底在寻找什么。这个过程肯定会花费更多时间,并且尝试从更大、更复杂的例程中提取一小段代码可能会很烦人,但这是值得的。这里是stack overflow guidelines 创建这样一个例子!
  • 谢谢,是的...我一定会考虑的。

标签: python pandas seaborn


【解决方案1】:

如果你有这样的 DataFrame:

years = range(2016,2019)
months = range(1,6)

df = pd.DataFrame(index=pd.MultiIndex.from_product([years,months]))
df['vals'] = np.random.random(size=len(df))

您可以使用以下方法将数据重新格式化为矩形:

df2 = df.reset_index().pivot(columns='level_0',index='level_1',values='vals')

sns.heatmap(df2)

【讨论】:

  • 我想你得到的正是我的问题,而你将级别 0 和级别 1 转换为行和列的最后一部分正是我想要的。尽管如此,我的表看起来与您模拟的表非常相似,但使用此消息 Traceback(最近一次调用最后一次)拒绝了该转换:KeyError:'level_1'
  • 如果我输入 dayofweek.index 我会得到 MultiIndex(levels=[[2016, 2017, 2018, 2019], ['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday ', '星期二', '星期三']], 标签=[[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3], [0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6]], names=['YR', 'DOW'])
  • 由于您的索引有名称,它们在执行reset_index() 时会被保留,然后pivot 必须使用正确的列名称:df.reset_index.pivot(columns='YR', index='DOW', values='<name of the column containing the values>')
  • 如果您认为您的问题已得到解答,请考虑通过单击左侧的复选标记关闭主题来接受答案
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2016-01-10
  • 2021-01-14
  • 2018-10-28
  • 2018-08-13
  • 2019-10-28
  • 2021-05-15
相关资源
最近更新 更多