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

绘制国家奖牌柱状图时遇TypeError: unhashable type: 'numpy.ndarray'问题

错误原因分析
  • plt.bar()函数的第二个参数需要传入单个数值(奖牌的数量),但你当前的goldMedals、silverMedals、bronzeMedals是筛选后的DataFrame对象(不是计数结果)。当matplotlib尝试处理这个对象时,因为其底层的numpy数组属于不可哈希类型,所以抛出TypeError: unhashable type: 'numpy.ndarray'错误。
解决方案

方式一:修改原代码,直接统计奖牌数量

把筛选DataFrame的操作改成统计数量,用.shape[0]获取筛选后的行数(即奖牌数量):

import numpy as np
import matplotlib.pyplot as plt

N = 3
ind = np.arange(N) 
width = 0.25

# 改为统计数量,而不是保留整个DataFrame
goldMedals = df[(df.Medal == 'Gold')].shape[0]
bar1 = plt.bar(ind, goldMedals, width, color='gold')
  
silverMedals = df[(df.Medal == 'Silver')].shape[0]
bar2 = plt.bar(ind+width, silverMedals, width, color='silver')
  
bronzeMedals = df[(df.Medal == 'Bronze')].shape[0]
bar3 = plt.bar(ind+width*2, bronzeMedals, width, color='brown')
  
plt.xlabel("Medal")
plt.ylabel('Count')
plt.title("Medal Portugal")
  
plt.xticks(ind+width,['Gold', 'Silver', 'Bronze'])
plt.legend( (bar1, bar2, bar3), ('Gold', 'Silver', 'Bronze') )
plt.show()

注:修正了原代码里银色柱子颜色写错(原代码用了bronze),以及xticks里的顺序错误问题

方式二:用value_counts()更简洁统计

一次性统计所有奖牌类型的数量,代码更简洁:

import matplotlib.pyplot as plt

# 统计当前国家各奖牌数量,确保三种奖牌都被统计(无则补0)
medal_counts = df['Medal'].value_counts().reindex(['Gold', 'Silver', 'Bronze'], fill_value=0)
# 绘制柱状图
medal_counts.plot(kind='bar', color=['gold', 'silver', 'brown'])

plt.xlabel("Medal")
plt.ylabel('Count')
plt.title("Medal Portugal")
plt.xticks(rotation=0)  # 让x轴标签水平显示
plt.show()

内容的提问来源于stack exchange,提问作者André Cunha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:40:48