Seaborn热力图结合CSV报错:无法转字符串为浮点数、无法重塑
解决Seaborn Heatmap可视化商店商品数据的两个问题
问题1:ValueError: could not convert string to float: 'Misc - Item'
首先你代码里有个明显笔误:定义了data = pd.read_csv(...),但后面调用了未定义的dfraw,先改成df = data[list_string]再说。但核心问题是:Seaborn的heatmap只接受数值型二维数据,你的DataFrame里全是文本列(Item和Store都是字符串),直接传入肯定会报错,因为heatmap无法把文本转换成数值计算。
正确做法是先把商品-商店的对应关系转换成数值型交叉表,比如统计每个商品在各商店的出现次数:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 读取数据并修正笔误 data = pd.read_csv('OOR_excerpt.csv', encoding='cp1252') # 生成交叉表,统计每个Item在每个Store的出现频次 cross_tab = pd.crosstab(data['Item'], data['Store']) # 绘制热力图,annot=True显示具体数值 sns.heatmap(cross_tab, annot=True, cmap='viridis') plt.show()
问题2:ValueError: Index contains duplicate entries, cannot reshape
pivot()方法要求**(行索引, 列名)的组合必须唯一**,如果你的数据里存在同一个商品在同一家商店出现多次(比如重复购买同一件商品),pivot()就无法处理重复的组合,因为它不知道如何聚合这些重复数据。
解决方法是用pivot_table()替代pivot(),指定聚合函数来处理重复条目,比如统计次数:
# 用pivot_table处理重复条目,aggfunc='count'统计出现次数,fill_value=0填充空值 heatmap_df = data.pivot_table(index='Item', columns='Store', values='Item', aggfunc='count', fill_value=0) sns.heatmap(heatmap_df, annot=True) plt.show()
如果你的数据有购买数量列(比如Quantity),可以把values改成Quantity,aggfunc改成sum来统计总购买量。
另外提一句:清理浏览器缓存和这些报错完全无关,问题本质是对Seaborn heatmap的输入要求、pivot与pivot_table的区别理解不到位。
内容的提问来源于stack exchange,提问作者candidateredfuel
相关产品推荐
相关产品推荐

