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

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日

悬赏问题

  • ¥15 android报错 brut.common.BrutException: could not exec (exit code = 1)
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?