You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用透视数据绘制热力图出现重复索引错误如何解决

问题修复方案

报错原因说明

  • 第一次调用pivot()报错,是因为数据中存在多个相同day+hour的组合,pivot()要求分组键必须唯一,无法直接完成数据重塑
  • 第二次调用pivot_table()报DataError,是因为未显式指定聚合函数,或是数值列类型识别异常

修复方案(两种可选)

方案1:基于现有可运行代码直接修改轴标签

你已经可以通过day_num正常绘图,只需手动替换y轴的刻度标签为星期名称即可,代码如下:

import seaborn as sns
import matplotlib.pyplot as plt

# 原有转换周几数字的代码
df['day_num'] = df['timestamp'].dt.weekday

# 绘制热力图
ax = sns.heatmap(df.pivot_table(index="day_num", columns="hour", values="consumption"))

# 按顺序设置y轴刻度标签,0对应周一,6对应周日
# 要英文全称可替换为 ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
# 要英文缩写可替换为 ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
week_labels = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]

ax.set_yticklabels(week_labels, rotation=0)
plt.show()

方案2:直接用星期字符串作为索引绘图

先将day列设置为有序分类类型,保证周几的顺序正确,再直接做透视表,不需要转数字也能正常绘图:

import seaborn as sns
import pandas as pd

# 按周几顺序定义分类规则,和你数据中day列的字符串格式对应即可
week_order = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
df['day'] = pd.Categorical(df['day'], categories=week_order, ordered=True)

# 直接用day列做透视表,显式指定聚合函数为均值,可根据需求替换为sum、max等
pivot_df = df.pivot_table(index="day", columns="hour", values="consumption", aggfunc="mean")

# 绘制热力图
sns.heatmap(pivot_df)

显式指定aggfunc参数可以避免默认聚合规则触发的数值类型识别错误。

内容的提问来源于stack exchange,提问作者Joehat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:36:01