通过分组两列创建热力图。

3

我想使用plt.imshow()创建一个热图数组。但是我对如何转换我的数据框和填充7x24数组有些疑虑。我的目标是计算所有在相同日期和小时的访问次数:

visits = [
   (1,13),
   (2,1),
   (1,13),
   (1,13),
   (2,18),
   (5,3),
   (6,1),
   (5,3),
   (1,2),
   (2,16),
   (2,16),
   (2,18),
   (4,7)
]

expected_df = [
    (1,13,3),
    (2,1,1),
    (2,18,2),
    (5,3,2),
    (1,2,1),
    (2,16,2),
    (4,7,1),
    (6,1,1)
]

visits = pd.DataFrame(visits , columns = ['day','hour'])
expected_df = pd.DataFrame(expected_df , columns = ['day','hour', 'count'])

我对Pandas很陌生,不知道如何将访问数据框转换为期望的数据框,并创建一个7x24的数组,以便使用plt.imshow()创建热力图。希望我的问题足够清晰明了。

2个回答

2

首先,您想按多个列进行分组(并重置索引并给其命名):

expected_df = visits.groupby(['day', 'hour']).size().reset_index(name='count')

对于第二部分绘图,我假设从上下文中得知没有数据意味着没有访问量,在热力图上显示为0。

heat = np.zeros((7,24))
heat[expected_df['day'], expected_df['hour']] = expected_df['count']
plt.imshow(heat)
plt.show()

1

方法:1

首先将结果放入一个映射(map)中,以便于对元组列表进行计数操作。

counts = list({x: visits.count(x) for x in visits})
# {(1, 13): 3, (2, 1): 1, (2, 18): 2, (5, 3): 2, (6, 1): 1, (1, 2): 1, (2, 16): 2, (4, 7): 1}

然后将其转换为列表。
expected_df = list((x, y, counts[(x, y)]) for x, y in counts)
# [(1, 13, 3), (2, 1, 1), (2, 18, 2), (5, 3, 2), (6, 1, 1), (1, 2, 1), (2, 16, 2), (4, 7, 1)]

方法:2

更简单的解决方案只需要

list(set((x, y, visits.count((x, y))) for x, y in visits))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接