我正在遍历字典列表并创建一个数据框,但是如果缺少键,就会遇到问题。我可以使用“ 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])
答案 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]
,如果键不存在,则返回value
。 value
默认为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