首页 > 解决方案 > 遍历字典时缺少键

问题描述

我正在遍历字典列表并创建一个数据框,但是如果缺少键,我就会遇到问题。我可以使用“try:except:”进行异常处理,但是有很多键,我更喜欢使用自定义函数来减少代码量。

顺便说一句,由于我的实际场景中字典列表的复杂性,我不能简单地这样做来创建我的数据框:

# can't do this    
df = pd.DataFrame(dict_list)

如果缺少键,示例数据和错误:

dict_list =[{'city':'smithville','zip':1234},{'city':'toonville'}]

df = pd.DataFrame()
for ind,val in enumerate(dict_list):
    city = dict_list[ind]['city']
    zip = dict_list[ind]['zip']
    df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
    df = pd.concat([df,df1])

错误:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-52-0c2951af44ad> in <module>
      2 for ind,val in enumerate(dict_list):
      3     city = dict_list[ind]['city']
----> 4     zip = dict_list[ind]['zip']
      5     df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
      6     df = pd.concat([df,df1])

KeyError: 'zip'

这有效:

df = pd.DataFrame()
for ind,val in enumerate(dict_list):
    city = dict_list[ind]['city']
    try:
        zip = dict_list[ind]['zip']
    except:
        zip = np.nan
    df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
    df = pd.concat([df,df1])

df

    city    zip_code
0   smithville  1234.0
0   toonville   NaN

我想使用一个函数来完成上述异常处理,但我正在努力解决这个问题。这是我到目前为止所拥有的,但它不起作用:

def get_value(x,y):
    try:
        x = y
        return(x)
    except KeyError:
        x = np.nan

df = pd.DataFrame()
for ind,val in enumerate(dict_list):
    get_value(city,dict_list[ind]['city'])
    df1 = pd.DataFrame({'city':[city]})
    df = pd.concat([df,df1])

错误

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-67-3a634901ade7> in <module>
      1 df = pd.DataFrame()
      2 for ind,val in enumerate(dict_list):
----> 3     get_value(city,dict_list[ind]['city'])
      4     df1 = pd.DataFrame({'city':[city]})
      5     df = pd.concat([df,df1])

NameError: name 'city' is not defined

标签: pythonpandas

解决方案


您可以使用dict.get并提供默认值np.NaN

import pandas as pd
import numpy as np
dict_list =[{'city':'smithville','zip':1234},{'city':'toonville'}]

df = pd.DataFrame()
for ind,val in enumerate(dict_list):
    city = dict_list[ind].get('city',np.NaN) # get if possible, default to np.NaN
    zipp = dict_list[ind].get('zip',np.NaN)  # get if possible, default to np.NaN
    df1 = pd.DataFrame({'city':[city], 'zip_code':[zipp]})
    df = pd.concat([df,df1])

print(df)

输出:

         city  zip_code
0  smithville    1234.0
0   toonville       NaN

不要zip用作变量,你隐藏了内置的 zip 函数。


推荐阅读