【问题标题】:How to fix KeyError when assigning regions to states in a dictionary将区域分配给字典中的状态时如何修复 KeyError
【发布时间】:2019-10-31 09:44:26
【问题描述】:

我正在为每个单独的州分配区域。我的代码从一个 excel 文件中读取,大约有 30k 行。我建立了一个字典,将每个州分配给一个地区,并将州缩写分配给每个州名。我正在尝试创建一个将填充每个行项目区域的列,但在“MA”处不断收到 KeyError(因为我的 Excel 文件中没有此状态的行项目)。

我尝试使用“except”和“if missing”来写一个短语,但似乎都没有清除错误并产生预期的结果。我也尝试从字典中删除 MA,但出现了同样的错误。我是 Python 的新手——我相信这里有一个简单的修复方法,但不知道它是什么。

states = {
    'AK': 'Alaska',
    'AL': 'Alabama',
    'AR': 'Arkansas',
    'AZ': 'Arizona',
    'CA': 'California',
    'CO': 'Colorado',
    'CT': 'Connecticut',
    'DC': 'District of Columbia',
    'DE': 'Delaware',
    'FL': 'Florida',
    'GA': 'Georgia',
    'HI': 'Hawaii',
    'IA': 'Iowa',
    'ID': 'Idaho',
    'IL': 'Illinois',
    'IN': 'Indiana',
    'KS': 'Kansas',
    'KY': 'Kentucky',
    'LA': 'Louisiana',
    'MA': 'Massachusetts',
    'MD': 'Maryland',
    'ME': 'Maine',
    'MI': 'Michigan',
    'MN': 'Minnesota',
    'MO': 'Missouri',
    'MS': 'Mississippi',
    'MT': 'Montana',
    'NC': 'North Carolina',
    'ND': 'North Dakota',
    'NE': 'Nebraska',
    'NH': 'New Hampshire',
    'NJ': 'New Jersey',
    'NM': 'New Mexico',
    'NV': 'Nevada',
    'NY': 'New York',
    'OH': 'Ohio',
    'OK': 'Oklahoma',
    'OR': 'Oregon',
    'PA': 'Pennsylvania',
    'RI': 'Rhode Island',
    'SC': 'South Carolina',
    'SD': 'South Dakota',
    'TN': 'Tennessee',
    'TX': 'Texas',
    'UT': 'Utah',
    'VA': 'Virginia',
    'VT': 'Vermont',
    'WA': 'Washington',
    'WI': 'Wisconsin',
    'WV': 'West Virginia',
    'WY': 'Wyoming'
}
stateplusdc = states.keys()
state_abbrev = {v: k for k, v in states.items()}
state_code = {
    'AK': '10','AL': '4', 'AR': '9', 'AR': '6', 'CA': '9', 'CO': '8',   
'CT': '1', 'DC': '3', 'DE': '3', 'FL': '4', 'GA': '4', 'HI': '9', 'IA': '7', 'ID': '10', 'IL': '5', 'IN': '5', 'KS': '7', 'KY': '4', 'LA': '6', 'MA': '1', 'MD': '3', 'ME': '1', 'MI': '5', 'MN': '5','MO': '7', 'MS': '4', 'MT': '8', 'NC': '4', 'ND': '8', 'NE': '7', 'NH': '1', 'NJ': '2', 'NM': '6','NV': '9', 'NY': '2', 'OH': '5', 'OK': '6','OR': '10', 'PA': '3', 'PR': '2', 'RI': '1', 'SC': '4', 'SD': '8', 'TN': '4', 'TX': '6', 'UT': '8', 'VA': '3', 'VI': '2', 'VT': '1', 'WA': '10', 'WI': '5', 'WV': '3', 'WY': '8', 'PI': '9'
}

state_region = {v: k for k, v in state_code.items()}

excel_file = r'/Users/amandawhiting/Desktop/PA_spending_excel.xlsx'
df = pd.read_excel(excel_file)
df = df.rename(columns={'DAMAGE_CATEGORY_CODE': 'damageCode', 'FEDERAL_SHARE_OBLIGATED':'FedShareObligated',  'PROJECT_AMOUNT': 'ProjectAmount'})  
df = df[df['FedShareObligated']>= 0] 
df = df[df['ProjectAmount'] >= 0df2 =   pd.read_csv("/Users/amandawhiting/Desktop/DisasterDeclarationsSummaries.csv", usecols = ['disasterNumber', 'fyDeclared', 'state'])

df = df[df['damageCode'] != 'A - Debris Removal']
df = df[df['damageCode'] != 'B - Protective Measures']
df = df[df['damageCode'] != 'Z - State Management']
df = df[df['damageCode'] != 'H - Fire Management']
df = df.drop_duplicates() 
df = df.reset_index(drop=True)

df2 = pd.read_csv("/Users/amandawhiting/Desktop/DisasterDeclarationsSummaries.csv", usecols = ['disasterNumber', 'fyDeclared', 'state'])
df2 = df2[df2['fyDeclared'] > 1991]
df2 = df2[df2['fyDeclared'] < 2017]
df2 = df2.reset_index(drop=True)
df2['disasterNumber'] = df2['disasterNumber'].astype(int)

fulldf = pd.merge(df, df2, left_on = 'DISASTER_NUMBER', right_on = 'disasterNumber', how = 'inner',)
fulldf = fulldf.drop_duplicates() 
fulldf = fulldf.reset_index(drop=True)

def get_region():
    return [state_region[i] for i in fulldf['state']]

fulldf["Region"] = get_region()

fulldf.head()

预期结果:现有表中标有“区域”的新列用该行中该州的相应区域填充每个单元格。

实际结果:关键错误'MA':


KeyError                                  Traceback (most recent call    last)
<ipython-input-403-13becd272809> in <module>
 31     return [state_region[i] for i in fulldf['state']]
 32 
    ---> 33 fulldf["Region"] = get_region()
 34 
 35 fulldf.head()

<ipython-input-403-13becd272809> in get_region()
 29 
 30 def get_region():
    ---> 31     return [state_region[i] for i in fulldf['state']]
 32 
 33 fulldf["Region"] = get_region()

<ipython-input-403-13becd272809> in <listcomp>(.0)
 29 
 30 def get_region():
    ---> 31     return [state_region[i] for i in fulldf['state']]
 32 
 33 fulldf["Region"] = get_region()

KeyError: 'MA'

【问题讨论】:

  • @cs95 我不确定你的意思。我在上面复制并粘贴了我的代码。它没有通过,还是我错过了什么?
  • 哎呀,没想到要滚动。对此感到抱歉。
  • 您的代码中的fulldf 是什么?它没有定义。
  • @balderman 哎呀,对不起。不想在这里列出我的所有代码,因为我认为没有必要。 fulldf 是我的数据框的名称。如果您认为最好,我可以发布我的整个代码。
  • @AmandaElizabeth 粘贴最小的代码 sn-p,让其他人重现该问题。用当前的代码我们做不到。

标签: python pandas numpy dictionary jupyter


【解决方案1】:

IIUC,您正在寻找:

# replace non-available keys with NA
fulldf["Region"] = fulldf['state'].map(state_region)

# keep the non-available keys intact
fulldf["Region"] = fulldf['state'].replace(state_region)

【讨论】:

  • 我认为这很接近——尤其是第二个解决方案,除了没有将区域返回给我,而是返回状态缩写。
  • 如 cmets 中所述,请提供fulldf 的样本(10 行)和预期输出。它有助于大大减少此类问题。
  • 然后试试:fulldf["Region"] = fulldf['state'].map(state_code)
  • 执行print(fulldf[['state']].head(10)) 并复制输出。另外,从这 10 行中指定您想要的内容。
【解决方案2】:

试试看:

state_region = {v: k for k, v in state_code.items()}

def get_region():
    result = []
    for i in fulldf['state'] :
        if i in state_region :
            result.append(state_region[i])
        else :
            result.append("NA")
    return result

【讨论】:

  • @cccnrc 这创建了正确的列而没有错误,但填充了不正确的结果。整列用“NA”填充
  • @user3483203 将地区代码映射到州缩写,但我对此并不熟悉,所以我可能做错了
  • 我在 state_region 中反转了你的 k:v,已编辑,现在试试
  • 仍然返回相同的结果。没有错误,正确的列,只有“NA”
  • 你想从函数返回中得到什么?一个列表?你能在你的问题中加上“fulldf”的标题吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多