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
相关产品推荐
相关产品推荐

