遍历字典时缺少键

时间:2019-06-11 17:15:58

标签: python pandas

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

由于我实际情况中词典列表的复杂性,我不能简单地这样做来创建数据框:

permit

示例数据,如果缺少密钥,则会出错:

# 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])

3 个答案:

答案 0 :(得分:2)

您可以使用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函数。

答案 1 :(得分:0)

dict数据结构提供了这一点:

dct.get(key, value)

,如果键存在,则返回dct[key],如果键不存在,则返回valuevalue默认为None

答案 2 :(得分:0)

dict.get应该可以解决问题。

import numpy as np
import pandas as pd

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)
    zip = dict_list[ind].get('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