m0_72763161 2023-04-23 17:18 采纳率: 80%
浏览 29
已结题

python一直报错

报错unhashable type: 'numpy.ndarray',想问问怎么改哇!

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df=pd.read_excel('/Users/mac/Desktop/实验七  数据包(1)/B39.xlsx')
plt.rcParams['font.sans-serif']=['Songti SC']
labels=np.array(['食品支出','衣着支出','居住','家庭设备及用品','医疗保健','交通和通信','文教娱乐服务','其他'])
dataLenth=6
df1=np.array(df[df['地区']=='北京'])
df2=np.array(df[df['地区']=='天津'])
df3=np.array(df[df['地区']=='上海'])
df4=np.array(df[df['地区']=='重庆'])
angles=np.linspace(0,2*np.pi,dataLenth,endpoint=False)
df1=np.concatenate((df1,[df1[0]]))
df2=np.concatenate((df2,[df2[0]]))
df3=np.concatenate((df3,[df3[0]]))
df4=np.concatenate((df4,[df4[0]]))
angles=np.concatenate((angles,[angles[0]]))
plt.polar(angles,df1,color='r',linestyle='-',marker='v',linewidth=2,label='北京')
plt.fill(angles,df1,facecolor='r',alpha=0.5)
plt.polar(angles,df2,color='c',linestyle='--',marker='+',linewidth=2,label='天津')
plt.fill(angles,df2,facecolor='c',alpha=0.5)
plt.polar(angles,df3,color='purple',linestyle='-·',marker='s',linewidth=2,label='上海')
plt.fill(angles,df3,facecolor='purple',alpha=0.5)
plt.polar(angles,df4,color='gray',linestyle=':',marker='p',linewidth=2,label='重庆')
plt.fill(angles,df4,facecolor='gray',alpha=0.5)
plt.thetagrids(range(0,360,45),labels)
plt.ylim(0,10000)
plt.legend(loc='upper right',bbox_to_anchor=(1.2,1.1))
plt.show()

img

  • 写回答

4条回答 默认 最新

  • AllenGd 大数据领域优质创作者 2023-04-23 17:28
    关注

    这个错误出现在多数情况下都是由于 numpy.ndarray 类型的数据不能被哈希(hash)而引起的。

    在你的代码中,出现 "unhashable type: 'numpy.ndarray'" 错误的原因是,你在用 numpy.array 函数将 pandas.DataFrame 数据转化为 numpy.ndarray 类型时,得到的 ndarray 类型数据不可哈希,因此无法作为字典的键(例如 plt.fill 函数中),从而引发了错误。

    在这里,我们可以将 numpy.ndarray 类型数据转换成 python 内建的 list (可以被哈希),再作为函数参数输入即可,方法是:

    df1 = df1.tolist()
    df2 = df2.tolist()
    df3 = df3.tolist()
    df4 = df4.tolist()
    

    这些操作将 df1, df2, df3 和 df4 的数据类型从 numpy.ndarray 转化为 list,之后就可以正常地使用 plt.fill 函数了。

    以下是修改后的代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np
    
    df = pd.read_excel('/Users/mac/Desktop/实验七  数据包(1)/B39.xlsx')
    plt.rcParams['font.sans-serif'] = ['Songti SC']
    labels = np.array(['食品支出', '衣着支出', '居住', '家庭设备及用品', '医疗保健', '交通和通信', '文教娱乐服务', '其他'])
    dataLenth = 6
    df1 = np.array(df[df['地区'] == '北京'])
    df2 = np.array(df[df['地区'] == '天津'])
    df3 = np.array(df[df['地区'] == '上海'])
    df4 = np.array(df[df['地区'] == '重庆'])
    angles = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False)
    df1 = np.concatenate((df1, [df1[0]]))
    df2 = np.concatenate((df2, [df2[0]]))
    df3 = np.concatenate((df3, [df3[0]]))
    df4 = np.concatenate((df4, [df4[0]]))
    angles = np.concatenate((angles, [angles[0]]))
    
    # 转换 ndarary 数据类型为 list
    df1 = df1.tolist()
    df2 = df2.tolist()
    df3 = df3.tolist()
    df4 = df4.tolist()
    
    plt.polar(angles, df1, color='r', linestyle='-', marker='v', linewidth=2, label='北京')
    plt.fill(angles, df1, facecolor='r', alpha=0.5)
    
    plt.polar(angles, df2, color='c', linestyle='--', marker='+', linewidth=2, label='天津')
    plt.fill(angles, df2, facecolor='c', alpha=0.5)
    
    plt.polar(angles, df3, color='purple', linestyle='-·', marker='s', linewidth=2, label='上海')
    plt.fill(angles, df3, facecolor='purple', alpha=0.5)
    
    plt.polar(angles, df4, color='gray', linestyle=':', marker='p', linewidth=2, label='重庆')
    plt.fill(angles, df4, facecolor='gray', alpha=0.5)
    
    plt.thetagrids(range(0, 360, 45), labels)
    plt.ylim(0, 10000)
    plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1.1))
    plt.show()
    

    希望这个回答对你有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度