首页 > 解决方案 > 如何解决“浮动”对象不可下标?

问题描述

我有这个功能,我正在为一名玩家制作热图并传递地图:

def heat_pass_map(data, player_name):
    pass_data = data[(data['type_name'] == "Pass") & (data['player_name'] == player_name)]
    action_data = data[(data['player_name']==player_name)]
    
    fig=plt.figure()
    fig.set_size_inches(7, 5)
    ax=fig.add_subplot(1,1,1)
    draw_pitch(ax)
    plt.axis('off')

    #passes
    for i in range(len(pass_data)):
        # we also differentiate different half by different color
        color = "blue" if pass_data.iloc[i]['period'] == 1 else "red"
        ax.annotate("", xy = (pass_data.iloc[i]['pass_end_location'][0], pass_data.iloc[i]['pass_end_location'][1]), xycoords = 'data', xytext = (pass_data.iloc[i]['location'][0], pass_data.iloc[i]['location'][1]), textcoords = 'data', arrowprops=dict(arrowstyle="->",connectionstyle="arc3", color = color))
      
    #heatmap
    x_coord = [i[0] for i in action_data['location']]
    y_coord = [i[1] for i in action_data['location']]
    sns.kdeplot(x = x_coord, y = y_coord, shade = "True", thresh = 0, cmap = "Greens", n_levels = 10)
    
    #create arrow legend
    blue_arrow = mlines.Line2D([], [], c='blue', marker=r'$\rightarrow$', markersize=15, linestyle='None', label='First half pass')
    red_arrow = mlines.Line2D([], [], c='red', marker=r'$\rightarrow$', markersize=15, linestyle='None', label='Second half pass')
    
    plt.ylim(0, 80) # need this, otherwise kde plot will go outside
    plt.xlim(0, 120)
    plt.legend(handles=[blue_arrow, red_arrow], loc='upper right')
    plt.title(str(player_name)+ "'s pass map")
    plt.show()

此功能适用于大多数球员,但现在我看到试图为一些阿拉伯足球运动员绘制地图,例如:Mohammad Ibrahim Al Sahlawi

因此,当我调用加载数据时:(单击此处获取 .json 文件

with open(r'C:\Users\Catalin\Desktop\WorldCupData\data\events\7525.json', encoding = 'utf-8') as data_file:    # r inainte de string ca sa il ia ca raw data
    data = json.load(data_file)
df = pd.json_normalize(data, sep = "_")
heat_pass_map(df, 'Mohammad Ibrahim Al Sahlawi')

出现以下错误:

TypeError                                 Traceback (most recent call last) <ipython-input-52-b5a94966684b> in <module>
----> 1 heat_pass_map(df, 'Mohammad Ibrahim Al Sahlawi')

<ipython-input-49-5b6755070382> in heat_pass_map(data, player_name)
     16 
     17     #heatmap
---> 18     x_coord = [i[0] for i in action_data['location']]
     19     y_coord = [i[1] for i in action_data['location']]
     20     sns.kdeplot(x = x_coord, y = y_coord, shade = "True", thresh = 0, cmap = "Greens", n_levels = 10)

<ipython-input-49-5b6755070382> in <listcomp>(.0)
     16 
     17     #heatmap
---> 18     x_coord = [i[0] for i in action_data['location']]
     19     y_coord = [i[1] for i in action_data['location']]
     20     sns.kdeplot(x = x_coord, y = y_coord, shade = "True", thresh = 0, cmap = "Greens", n_levels = 10)

TypeError: 'float' object is not subscriptable

预期结果应如下所示: 在此处输入图像描述

标签: pythonjsonpython-3.xpandasdataframe

解决方案


根据您的 JSON,action_data看起来像

{
  ...
  "location" : [ 61.0, 40.0 ],
  ...
}

现在,我们有

[i[0] for i in action_data['location']]

所以对于每一个iin action_data['location'],我们都会做一些事情。i,在这种情况下,将采用值61.040.0。现在,我们正在做的“某事”是i[0],所以你的清单将是

[61.0[0], 40.0[0]]

这是胡说八道。如果您想将这两个值提取到x_coordandy_coord中,您可以这样做

x_coord, y_coord = action_data['location']

并完全避免列表理解。


推荐阅读