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

使用Pandas导入Excel数据绘图时遇unhashable type: 'numpy.ndarray'错误求助

问题:导入Excel数据制作饼图时触发TypeError: unhashable type: 'numpy.ndarray'

你尝试从Excel导入数据制作饼图,但运行代码后遇到了类型错误,先梳理下你的代码和报错信息:

你的代码

import pandas as pd 
import matplotlib.pyplot as plt
basedatos = pd.read_excel(r'C:\Users\CFK\Documents\Python example\Data Example.xlsx',sheet_name='results')
print(basedatos)

fig, ax = plt.subplots()
ax.plot(basedatos)
plt.show()

报错信息

TypeError: unhashable type: 'numpy.ndarray'

详细错误栈:

File "C:\Users\CFK\anaconda3\lib\site-packages\matplotlib\category.py", line 116, in default_units axis.set_units(UnitData(data)) 
 File "C:\Users\CFK\anaconda3\lib\site-packages\matplotlib\category.py", line 192, in __init__ self.update(data) 
 File "C:\Users\CFK\anaconda3\lib\site-packages\matplotlib\category.py", line 225, in update for val in OrderedDict.fromkeys(data): TypeError: unhashable type: 'numpy.ndarray' 
 QSocketNotifier: Multiple socket notifiers for same socket 2544 and type Read 

问题分析与解决方法

1. 核心错误原因

你踩了两个关键坑:

  • 用错了绘图函数:你目标是做饼图,但调用了ax.plot()——这个函数是用来画折线图的,完全不匹配饼图的需求。
  • 数据传递方式错误:直接把整个DataFrame传给ax.plot()时,matplotlib会尝试解析每一列的数据,如果你的DataFrame里包含numpy数组类型的列(或者列结构不符合折线图要求),就会触发"unhashable type: 'numpy.ndarray'"错误——因为matplotlib处理类别数据时,要求数据是可哈希的类型(比如字符串、数字),而numpy数组是不可哈希的。

2. 正确的解决步骤

第一步:先确认数据结构

在绘图前,先打印数据的前几行和基本信息,明确哪一列是类别、哪一列是对应数值:

print(basedatos.head())  # 查看数据前5行
print(basedatos.info())  # 查看各列的数据类型

第二步:用正确的饼图函数绘制

饼图需要一维的数值数组和对应的类别标签,使用ax.pie()函数来实现。假设你的DataFrame有两列:比如叫Category的类别列和叫Value的数值列,修改后的代码如下:

import pandas as pd 
import matplotlib.pyplot as plt

basedatos = pd.read_excel(r'C:\Users\CFK\Documents\Python example\Data Example.xlsx',sheet_name='results')
print(basedatos.head())

fig, ax = plt.subplots()
# 替换成你实际的列名
ax.pie(basedatos['Value'], labels=basedatos['Category'], autopct='%1.1f%%')
# 添加标题
ax.set_title('我的饼图')
# 保证饼图是正圆形
ax.axis('equal')
plt.show()

3. 额外注意事项

  • 如果数据里有空值或者非数值类型的数值列,先做清洗:比如用basedatos.dropna()删除空值,用pd.to_numeric()转换数值类型。
  • 如果你的DataFrame是单列数据,也可以用basedatos.iloc[:, 0]获取数值,标签可以自己手动指定。

内容的提问来源于stack exchange,提问作者Ilka Noemi Bustamante Lastra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:25:44