【问题标题】:Creating Pandas 2d heatmap based on accumulated values (rather than actual frequency)?根据累积值(而不是实际频率)创建 Pandas 2d 热图?
【发布时间】:2013-12-10 15:00:57
【问题描述】:

感谢阅读,我花了 3-4 个小时寻找解决此问题的示例,但找不到任何解决方法。我尝试过的那些似乎不适用于 pandas DataFrame 对象。任何帮助将不胜感激!:)

好的,这是我的问题。

我有一个包含 12 列的 Pandas DataFrame。 我有 500,000 行数据。

大部分列都是无用的。我感兴趣的变量/列称为:x,y 和利润

很多 x 和 y 点是相同的, 所以我想将它们组合成一个独特的组合,然后将每个独特组合的所有利润加起来。

每个独特的组合都是一个 bin(就像直方图中使用的 bin)

然后我想为每个 bin 绘制一个 x、y 的二维图表/热图等,并将颜色作为总利润。

例如

x,y,利润

7,4,230.0

7,5,162.4

6,8,19.3

7,4,-11.6

7,4,180.2

7,5,15.7

4,3,121.0

7,4,1162.8

注意 x=7, y=4 的值如何,有 3 行符合此条件.. 总利润应该是: 230.0 - 11.6 +1162.8 = 1381.2 所以在 bin x=7, y = 4 中,利润为 1381.2

注意值 x=7, y=5,有 2 个实例.. 总利润应为:162.4 + 15.7 = 178.1 所以在 bin x=7, y = 5 时,利润为 178.1

所以最后,我只想能够绘制:x,y,total_profit_of_bin

例如为了帮助说明我在寻找什么,我在互联网上找到了这个,它与我想要的相似,(忽略轴和数字)

http://2.bp.blogspot.com/-F8q_ZcI-HJg/T4_l7D0C7yI/AAAAAAAAAgE/Bqtx3eIHzRk/s1600/heatmap.jpg

非常感谢您花时间阅读:)

【问题讨论】:

  • 但是 x 和 y 可能不会有相同数量的垃圾箱,对吧?在图表上看起来如何?缺失值,你甚至会如何表示?图表上的每个刻度代表什么?你肯定想要大小相同的垃圾箱吧?我问的原因是因为通过 groupby 传递一个函数,你想做的事情会很容易,但你不能将这些数据聚合到等长的 bin 中。您可以将它们分开,但我仍然不明白这将如何在图表上起作用。

标签: python pandas frequency heatmap


【解决方案1】:

如果对于 x 的 'bin' 其中 x 的值相等,并且 y 的值相等,那么您可以使用 groupby.agg。看起来像这样

import pandas as pd
import numpy as np

df = YourData

AggDF = df.groupby('x').agg({'y' : 'max', 'profit' : 'sum'})

AggDF

这将为您提供我认为您想要的数据,然后您可以按照您认为合适的方式进行绘图。您也需要这方面的帮助吗?

注意,只有在每个“bin”内,即根据 x 的值分组的数据,y 的值相等时,这才会以您希望的方式工作。我认为一定是这种情况,否则我认为尝试将 x 和 y 绘制在一起没有多大意义。

【讨论】:

  • 嗨,谢谢你的快速回复。几乎完美!我在数据样本上对此进行了测试,Y 值很棒。例如,可能有多个 X 具有相同的 Y 值。但问题是,X 值是唯一的并且从不重复。例如x 线性地从 1 变为 350 .. 实际上可能有例如 x=50,y=62.2 和 x=50, y=84.16 .. 但是这个信息已经消失了。 p.s.如果你也能帮忙策划情节,那就太棒了。我正在阅读 O'Reilly 的 Pandas 书,因为我们说话的时候,这个情节似乎超出了本书的范围。非常感谢
  • 所以在你提到的组中 x = 50 你想聚合到什么值 y ?问题是我认为你设置问题的方式没有意义。你不想要一个图表,你想要两个。一个绘制 x 个利润箱,一个绘制 y。是对的吗?你不能同时做这两个,因为垃圾箱明显不同。有意义吗?
  • 嗨,嗯.. 也许我没有解释得那么清楚 :) 好的,在上面的例子中,在位置 (7,4),利润 z 的值(或绘图的颜色)是 1381.2 并且在位置 (7,5) 的 z (利润) 值是 178.1 .. 也可能有 (6,4) 和 (6,5) 具有不同的利润值.. 我只想拿 x&y 和找到唯一的对。然后是唯一对的利润。在一天结束的时候,我只有一个独特的 x&y 对的列表,以及与它们相关的总利润。例如 (2,4) 与 (4,2) 等不同
  • AggDF = df.groupby(['x', 'y'']).agg({'profit' : 'sum'}) - 对吧?
  • 看起来很棒,谢谢!我正在学习 Pandas,但还没有学习过这个.. 非常感谢..!你为我节省了大量时间,我也知道接下来要读什么:)
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多