How to handle Error "'NoneType' object has no attribute 'keys'", when converting list to DataFrame

10,489

Some players have no statistics, so play_dict_skaterstats for them is None. You might need to replace

skaterstats.append(play_dict_skaterstats)

with

if play_dict_skaterstats: 
    skaterstats.append(play_dict_skaterstats)

to skip these cases

Or you might need to set default values for this case, e.g.

if not play_dict_skaterstats:
    play_dict_skaterstats = {}
    play_dict_skaterstats['timeOnIce'] = None
    play_dict_skaterstats['assists'] = None
    ...
skaterstats.append(play_dict_skaterstats)
Share:
10,489

Related videos on Youtube

MisterButter
Author by

MisterButter

Updated on June 04, 2022

Comments

  • MisterButter
    MisterButter almost 2 years

    Trying to create a dataframe from a list but get error "'NoneType' object has no attribute 'keys'"

    import numpy as np
    import pandas as pd
    import requests
    import json
    from sklearn import preprocessing
    from sklearn.preprocessing import OneHotEncoder
    
    person = []
    position = []
    skaterstats = []
    person = []
    player_id = {}
     for game_id in range(2018020001, 2018020002, 1):
        url = 'https://statsapi.web.nhl.com/api/v1/game/{}/feed/live'.format(game_id)
        r = requests.get(url)
        game_data = r.json()
    
    for homeaway in ['home','away']:
        player_dict = game_data.get('liveData').get('boxscore').get('teams').get(homeaway).get('skaters')
        player_id[homeaway] = player_dict
    
    for homeaway in player_id:
        for playerID in player_id[homeaway]:
            play_dict_person = game_data.get('liveData').get('boxscore').get('teams').get(homeaway).get('players').get('ID' + str(playerID)).get('person')
            play_dict_position = game_data.get('liveData').get('boxscore').get('teams').get(homeaway).get('players').get('ID' + str(playerID)).get('position')
            play_dict_skaterstats = game_data.get('liveData').get('boxscore').get('teams').get(homeaway).get('players').get('ID' + str(playerID)).get('stats').get('skaterStats')
            person.append(play_dict_person)
            position.append(play_dict_position)
            skaterstats.append(play_dict_skaterstats)
    
    df_person = pd.DataFrame(person).head()
    df_position = pd.DataFrame(position).head()
    df_skaterstats = pd.DataFrame(skaterstats).head()
    
    ----> 3 df_skaterstats = pd.DataFrame(skaterstats).head() 
    
    AttributeError: 'NoneType' object has no attribute 'keys'
    

    The error occurs occurs only on this DataFrame, I have checked that the path should be correct and all. Link to the API below if it would to any guidance.

    This is the API: https://statsapi.web.nhl.com/api/v1/game/2017020002/feed/live

  • MisterButter
    MisterButter over 5 years
    Excellent solution! Thank you again Mister. Andersson, you truly are a wizard!